extern sub - libffi

A new ffi was added to core, with a syntax resembling perl6 NativeCall. Perl6 traits are cperl attributes, but attribute values may be deferred to run-time. Packagers need to add libffi to their library dependencies. Windows packages are provided, see appveyor.yml.

Signature args are run-time type checked

Run-time type violations a throw a new type warning, which can be made fatal with use types 'strict' or use warnings 'FATAL' => 'types';"Type of arg %s to %s should be %s (not %s)" in perldiag. The compile-time error uses the word "must" instead of "should". This might be a problem when typing an argument to str or Str, but the argument is stringified via overload from a class, e.g. File::Temp::Dir. This case, when the argument is not of str|Str, but a user-defined class with a stringify overload is not yet handled.

Better role composition

When roles are copied from a class to another, we can now handle XS methods and methods without internal lexical variables better, by simple GV aliasing.

The other methods are now properly cloned and the $self type is adjusted to the new class for the created new method, because v5.30 started argument type checking at run-time.

cperl can also now adjust field indices when composing roles, when the indices of the used lexical variables of the two methods do not match, by using the new internal experimental inliner. [cperl #311] The error "panic: cannot yet adjust field indices when composing role %s::%s into %s %s [cperl #311]" is gone in the general case.

Wildcards in Unicode property value specifications are now partially supported

You can now do something like this in a regular expression pattern

qr! \p{nv= /(?x) \A [0-5] \z / }!

which matches all Unicode code points which have numeric value is between 0 and 5 inclusive.

This marks another step in implementing the regular expression features the Unicode Consortium suggests.

qr'\N{name}' is now supported

Previously it was an error to evaluate a named character \N{...} within a single quoted regular expression pattern (whose evaluation is deferred from the normal place). This restriction is now removed.

Unicode 12.1 is supported

The Word_Break property, as in past Perl releases, remains tailored to behave more in line with expectations of Perl users. This means that sequential runs of horizontal white space characters are not broken apart, but kept as a single run. Unicode 11 changed from past versions to be more in line with Perl, but it left several white space characters as causing breaks: TAB, NO BREAK SPACE, and FIGURE SPACE (U+2007). We have decided to continue to use the previous Perl tailoring with regards to these.

As of July 2018, another aspect of Unicode 11.0 is causing problems, and that is the changing the Georgian script to have both lower and uppercase letters. It turns out that many devices do not have fonts installed that can display the new uppercase letters, and people using Georgian are finding their text more or less illegible. It is being suggested that implementations delay their adoption of this portion of 11.0. But since the next stable release of Perl is almost a year away, this aspect of 11.0 is being left in, with the option to back it out if things haven't improved by that time, or if we get too many complaints about the development release being unusable for Georgian users.

Because of a change in Unicode release cycles, Perl jumps from Unicode 10.0 in Perl 5.28 to Unicode 12.0 in Perl 5.30.

There are few new scripts: Elymaic, Nandinagari, Nyiakeng_Puachue_Hmong (Hmnp), Wancho, all of them not available for identifiers.

Handle qr!\p{nv=6/8}!

Allow a rational number specified in looking up the Numeric Value Unicode property to not be in lowest possible terms.

The Numeric Value property allows one to find all code points that have a certain numeric value. An example would be to match against any character in any of the world's scripts which is effectively equivalent to the digit zero.

We accept either integers (like \p{nv=9}) or rationals (like \p{nv=1/2}). But we also accept floating point representations in case a conversion to numeric has happened, (like \p{nv=0.5}). The necessary precision is now automatically pre-calculated and the lookup normalized.

The upper limit "n" specifiable in a regular expression quantifier of the form "{m,n}" has been doubled to 65534

The upper limit "n" specifiable in a regular expression quantifier of the form "{m,n}" has also been doubled to 65534.

The meaning of an unbounded upper quantifier "{m,}" remains unchanged. It matches 2**31 - 1 times on most platforms, and more on ones where a C language short variable is more than 4 bytes long.

-Drv now means something on -DDEBUGGING builds

Now, adding the verbose flag (-Dv) to the -Dr flag turns on all possible regular expression debugging, as with use re 'debug';. See re.

Contrary to what is said in the relevant perldelta, your code is now slower. Before it crashed with a segfault, now it does much more. The regular case is also slower due to stack handling on the heap, similar to the regexp changes in 5.10. [perl #108276].

Turkic UTF-8 locales are now seamlessly supported

Turkic languages have different casing rules than other languages for the characters "i" and "I". The uppercase of "i" is LATIN CAPITAL LETTER I WITH DOT ABOVE (U+0130); and the lowercase of "I" is LATIN SMALL LETTER DOTLESS I (U+0131). Unicode furnishes alternate casing rules for use with Turkic languages. Previously, Perl ignored these, but now, it uses them when it detects that it is operating under a Turkic UTF-8 locale.

It is now possible to compile perl to always use thread-safe locale operations.

Previously, these calls were only used when the perl was compiled to be multi-threaded. To always enable them, add

-Accflags='-DUSE_THREAD_SAFE_LOCALE'

to your Configure flags.

Check RUNNING_ON_VALGRIND, set destruct_level to 2

Detect if we are running under valgrind and set destruct_level to 2. If so, destruct all ops, leading to no valgrind leaks, even with --leak-check=full. cperl-only [cperl #400]

Security

Using a lookbehind assertion (like (?<=foo) or (?<!bar) previously would generate an error and refuse to compile. Now it compiles (if the maximum lookbehind is at most 255 characters), but raises a warning in the new experimental::vlb warnings category. This is to caution you that the precise behavior is subject to change based on feedback from use in the field.

Disallowed Limited Use Scripts

Unicode 10.0 started disallowing all Aspirational Use Scripts, but we didn't handle them at all. Table 4. Candidate Characters for Exclusion from Identifiers scripts are still allowed, and still need to be explicitly enabled as a use utf8 argument. cperl-only.

[CVE-2018-18311] Integer overflow leading to buffer overflow and segmentation fault

Integer arithmetic in Perl_my_setenv() could wrap when the combined length of the environment variable name and value exceeded around 0x7fffffff. This could lead to writing beyond the end of an allocated buffer with attacker supplied data.

Restrict my_setenv to ARG_MAX

perl5 fixed Perl_my_setenv() by allowing %ENV sizes larger than ARG_MAX (typically 128Kb), up to 2GB. This is considered a security risk. It writes onto the kernel stack, even if often caught by MAXEXECARGS "Argument list too long" kernel errors on the next exec call. cperl disallows %ENV larger than the sysconf(_SC_ARG_MAX)/MAX_ARG_STRLEN/ ARG_MAX/NCARGS size with a new "Environment size %d larger than the allowed %d" in perldiag error.

Incompatible Changes

Protected hash iterators

Iterating over a hash may now by default not change any key. Allow the previous destructive behavior of changing a hash while iterating over it with use hashiter; See [cperl #117], cperl-only.

Previously deprecated sysread()/syswrite() on :utf8 handles now fatal

Calling sysread(), syswrite(), send() or recv() on a :utf8 handle, whether applied explicitly or implicitly, is now fatal. This was deprecated in perl 5.24.

There were two problems with calling these functions on :utf8 handles:

All four functions only paid attention to the :utf8 flag. Other layers were completely ignored, so a handle with :encoding(UTF-16LE) layer would be treated as UTF-8. Other layers, such as compression are completely ignored with or without the :utf8 flag.

sysread() and recv() would read from the handle, skipping any validation by the layers, and do no validation of their own. This could lead to invalidly encoded perl scalars.

my() in false conditional prohibited

Declarations such as my $x if 0 are no longer permitted. This feature was deprecated in 5.10 (and replaced by two better constructs, one of it backwards compatible) and is now a fatal error. [perl #133543]

Note: cperl does not agree that this feature is a bug, but this ship sailed already over a decade ago.

pack() no longer can return malformed UTF-8

Any set of digits in the Common script are legal in a script run of another script

There are several sets of digits in the Common script. [0-9] is the most familiar. But there are also [\x{FF10}-\x{FF19}] (FULLWIDTH DIGIT ZERO - FULLWIDTH DIGIT NINE), and several sets for use in mathematical notation, such as the MATHEMATICAL DOUBLE-STRUCK DIGITs. Any of these sets should be able to appear in script runs of, say, Greek. But the design of 5.30 overlooked all but the ASCII digits [0-9], so the design was flawed. This has been fixed, so is both a bug fix and an incompatibility. [perl #133547] [perl #133547]

All digits in a run still have to come from the same set of ten digits.

Deprecations

Undeprecate "Unescaped left brace in regex" warnings and errors

In cperl only the following special unicode groups within regexes are reserved:

Name: \N{
Property: \p{ \P{
Break: \b{ \B{
Code: \x{ \o{
Group: \g{

All other /{}/ sequences are allowed in cperl and not deprecated anymore. There's no need to quote the literal \{ and \}, only if it's ambiguous and can be mixed up with those reserved unicode groups.

automake and more widespread utils does not need to be plagued by spurious "Unescaped left brace in regex" warnings, when they dont need to be quoted. We undeprecated those new warnings and errors, there's nothing more to reserve (yet). [cperl #362]

Remove support for qr/\p{_Case_Ignorable}

This property is no longer used in the core, nor in cpan, and is marked as for core use only, not necessarily stable. I have kept it around because it was work to remove it, but now the revamping of the property lookup scheme was causing failures with it, when compiling on early Unicode releases. That could be fixed with extra work, but simply removing it also fixes the problem and avoids future maintenance costs.

Remove support for qr/\p{_Comb_Above}

This property is no longer used in the core, nor in cpan, and is marked as for core use only, not necessarily stable. I have kept it around because it was work to remove it, but now the revamping of the property lookup scheme was causing failures with a similar property, and the previous commit removed that one.

Remove support for qr/\p{_CanonDCIJ}

The property is not used in cpan, and is being removed as part of the cleanup instigated because another of the 3 would require extra code to handle if we were to keep it around.

Improved Unicode numeric property lookups, for \p{nv=float}, in size and speed by using more pre-compiled perfect hashes instead of slow pure-perl invlist walks at run-time, esp. for all numeric properties (70 more). Also avoids more swash creations.

Translating from UTF-8 into the code point it represents now is done via a deterministic finite automaton, speeding it up. As a typical example, ord("\x7fff") now requires 12% fewer instructions than before. The performance of checking that a sequence of bytes is valid UTF-8 is similarly improved, again by using a dfa.

This speeds things up, but in the process several inconsistencies and bug fixes are made.

A few error messages have minor wording changes. This is essentially because the new way is integrated into the regex error handling mechanism that marks the position in the input at which the error occurred. That was not possible previously. The messages now also contain additional back-trace-like information in case the error occurs deep in nested calls.

A user-defined property is implemented as a perl subroutine with certain highly constrained naming conventions. It was documented previously that the sub would be in the current package if the package was unspecified. This turned out not to be true in all cases, but now it is.

All recursive calls are treated as infinite recursion. Previously they would cause the interpreter to panic. Now, they cause the regex pattern to fail to compile.

Similarly, any other error likely would lead to a panic; now to just the pattern failing to compile.

The old mechanism did not detect illegal ranges in the definition of the property. Now, the range max must not be smaller than the range min. Otherwise, the pattern fails to compile.

The intention was to have each sub called only once during the lifetime of the program, so that a property's definition is immutable. This was relaxed so that it could be called once for all /i compilations, and potentially a second time for non-/i (the sub is passed a parameter indicating which). However, in practice there were instances when this was broken, and multiple calls were possible. Those have been fixed. Now (besides the /i,non-/i cases) the only way a sub can be called multiple times is if some component of it has not been defined yet. For example, suppose we have sub IsA() whose definition is known at compile time, and it in turn calls isB() whose definition is not yet known. isA() will be called each time a pattern it appears in is compiled. If isA() also calls isC() and that definition is known, isC() will be called just once.

There were some races and very long hangs should one thread be compiling the same property as another simultaneously. These have now been fixed.

Don't downgrade twice, the is_utf8 flags can be taken from the returned hek, which does the downgrading to bytes already.

The oelemfast signature changed from (:Ref,:Int):Any to ():Any. The object stays now as RV (as pad) and is not taken from the stack, the index neither.

Modules and Pragmata

The list of new and updated modules is modified automatically as part of preparing a Perl release, so the only reason to manually add entries here is if you're summarising the important changes in the module update. (Also, if the manually-added details don't match the automatically-generated ones, the release manager will have to investigate the situation carefully.)

New major release, with dVAR support and experimental cross support and -m (module) support. Add $dynamic_copwarn needed for v5.29.7+ (not cperl). The new script buildcc for module support is not yet functional, only a placeholder.

Fixed long pathnames test for getcwd() on older systems, like debian-7.11 i386, which still returns ENAMETOOLONG on large enough buffers.

Fix the HAS_GET_CURRENT_DIR_NAME check, and the is_ENAMETOOLONG macro. Note that get_current_dir_name() is now in effect, which returns the current PWD, i.e. fastcwd, and not the realpath() (i.e the abs_path) of it. This e.g. broke some DBD::File tests, when behind symlinks.

cperl croak_no_modify adds now the SV to the message.
support make --silent.
support devel VERSION with _
fix deps
sync embed.fnc with cperl core, with #ifdef USE_CPERL
sync parts with 5.30 updates

Revert "Use latest blead embed.fnc"

It changed the meaning of several flags (n=>T, s=>S,M=>x,...) just for
some apidocs troubles which are easily solved otherwise.
It breaks backcompat, and breaks the equality of core embed.fnc.
perl5.30 also rejected it

make regen is now in two modes: cperl or perl5 (as in cperl-core embed_lib)

Extend dl_find_symbol on dl_win32 to mimic the POSIX behaviour with an empty libhandle argument: Search the symbol in all loaded shared libraries. This is a convenience platform-compat feature for the ffi.

ONLY_PRAGMA_WARNINGS reports only those warnings which are currently enabled by pragma warnings. When ONLY_PRAGMA_WARNINGS is not set then Encode would report all warnings. ONLY_PRAGMA_WARNINGS would have no effect when flag ENCODE_WARN_ON_ERR is not set.

Fatalized File::Glob::glob(), which was deprecated since 5.8. However, no deprecation message was issued; only perl5.008delta.pod and a comment in the file mention its deprecation. The warnings was added with v5.25.10.

In the documentation for each of the to_(bin|hex|oct|bytes) methods, add a reference to the corresponding from_(bin|hex|oct|bytes) method.

bnok() for Math::BigInt and Math::BigFloat now support the full Kronenburg extension. The behaviour is identical to the behaviour of the Maple and Mathematica function for negative integers n, k. Add tests. RT #95628.

Changes to Existing Diagnostics

cperl fatalized the error on non-grapheme string delimiters (ie. illegal utf8) in v5.25.3c already, e.g with qr ̂foobar̂. perl5 did it with v5.29.0 but used 3 error lines instead of just one.

"Use of unassigned code point or non-standalone grapheme for a delimiter" uses now 3 lines: "Use of unassigned code point or non-standalone grapheme for a delimiter is not allowed at -, near" "Use of unassigned code point or non-standalone grapheme for a delimiter is not allowed at -, near" "Execution of - aborted due to compilation errors."

Fixed the error cases when the double or long double probes returned undef.

Porting/do-make-cperl-release

Replace sha1sum with sha256sum, add gpg -a -b $pkg.

i_valgrind

Detect valgrind/valgrind.h and check RUNNING_ON_VALGRIND for setting destruct_level to 2.

Testing

Tests were added and changed to reflect the other additions and changes in this release. Furthermore, these significant changes were made:

All modules can now be tested in parallel. From the remaining exceptions ext/Pod-Html/t was fixed a while ago, and cpan/IO-Zlib/t with this release.

We also removed the remaining exception for files starting with 0. We assumed before 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. But in reality there's no such t/00-setup.t test and if so, it would still be run as very first test. CPAN testing via EUMM and Test::Harness does not obey this rule neither. The only existing exception is dist/ExtUtils-MakeMaker/t. The only module to be fixed was ext/FileCache/t. cperl-only.

t/TEST does not need any temp_needs_dot exceptions anymore. All core modules are now . in @INC clean. The only module to be fixed was cpan/libnet/t. cperl-only.

Honor more SKIP_SLOW_TESTS, esp. with B-C, esp. with -flto. Document all used ENV vars in t/harness.

op/hash-rt85026.t finds now almost ever a collision, and skips the test with usesafehashiter enabled (the default). Such not easily detectable destructive hash iters are now forbidden, thanks to usesafehashiter.

op/chdir.t when pwd is a symlink.

Platform Support

Platform-Specific Notes

Oracle Linux

DTrace support has been added by also looking for /sbin/dtrace. Install it with sudo yum install -y dtrace-utils dtrace-utils-devel.

Mac OS X

Perl's build and testing process on Mac OS X for -Duseshrplib builds is now compatible with Mac OS X System Integrity Protection (SIP).

SIP prevents binaries in /bin (and a few other places) being passed the DYLD_LIBRARY_PATH environment variable. For our purposes this prevents DYLD_LIBRARY_PATH from being passed to the shell, which prevents that variable being passed to the testing or build process, so running perl couldn't find libcperl.dylib.

To workaround that, the initial build of the perl executable expects to find libcperl.dylib in the build directory, and the library path is then adjusted during installation to point to the installed library.

Macports gcc-mp-9 -O is broken with ext/Config. You need to use a different compiler. [p5-Config #13]

Win32

sleep() with warnings enabled for a USE_IMP_SYS build no longer warns about the sleep timeout being too large. [perl #133376]

Support for compiling perl on Windows using Microsoft Visual Studio 2019 (containing Visual C++ 14.2) has been added.

Add DynaLoader fallbacks to dl_find_symbol to mimic the POSIX behaviour with an empty libhandle argument: Search the symbol in all loaded/most shared libraries. This is a convenience platform-compat feature for the ffi.

The new Windows 10 DTrace support has not been tested yet.

Linux

The hints now detect newer compilers and sets optimize=-O3 by default, needed for better -flto and inlining support, instead of -O2.

FreeBSD

Added /usr/local/include to incpth, which helps probing libffi during configpm. If was only in ccflags via -I.

Fixed wrong clang llvm-ar$llvmsuffix and arflags. BSD ar is fine to use -D.

Skip probing for -flto on cygwin. This reliably fails to find a proper image-base with that many new symbols, the adress space is just too small: Invalid relocation. Offset 0x.. at address 0x.. doesn't fit into 32 bits

Internal Changes

The first sizing pass has been eliminated from the regular expression compiler. An extra pass may instead be needed in some cases to count the number of parenthetical capture groups.

Added my_atof3() to support parsing strings which are not necessarily NUL-terminated to an NV. grok_atoUV supports that too now.

It is now forbidden to malloc more than PTRDIFF_T_MAX bytes. Much code (including C optimizers) assumes that all data structures will not be larger than this, so this catches such attempts before overflow happens.

A new function "my_strtod" in perlapi or its synonym, Strtod(), is now availabe with the same signature as the libc strtod(). It provides strotod() equivalent behavior on all platforms, using the best available precision, depending on platform capabilities and Configure options, while handling locale-related issues, such as if the radix character should be a dot or comma.

Enabled USE_REENTRANT_API with threads by default on all platforms. See reentr.c. Previously it was only enabled by default on darwin.

Added two new yet unused COP nextstate-like ops: setstate for the first inlined statement and keepstate for further inlined statements. This is part of the general inliner preparation, which is not yet fully enabled. The inliner is only internally used to create composed roles with different pad indices.

Added a new OP_IS_UNOP_AUXOP(op_type) macro for consistency. And a new HV_FETCH_NO_SV flag to allow storing arbitrary pointers as HeVAL.

Added the new experimental inliner, which can clone optrees and its associated data, and fixup the cloned optree for the new target (types, pad indices). This is not yet enabled by default, only used for role composition, not yet for general function inlining or loop unrolling. API: op_clone_optree, plus several internal functions.

For run-time type-checking this new API was added: arg_check_type_sv

embed.fnc has now seperated #ifdef USE_CPERL and more features from the plain perl5 API, because many perl5 64bit overflow bugs and size limitations arise from a broken API already. The lines are documented as perl5 security risk or perl5 limitation. The parser seperates any cperl from the perl5 API differences already at regen-time, plus the obvious compile-time seperation in the generated headers via the ifdef's.

Testing

Selected Bug Fixes

Regular expression matching no longer leaves stale UTF-8 length magic when updating $^R. This could result in length($^R) returning an incorrect value.

Fixed a failure to match properly.

An EXACTFish regnode has a finite length it can hold for the string being matched. If that length is exceeded, a second node is used for the next segment of the string, for as many regnodes as are needed. Care has to be taken where to break the string, in order to deal multi-character folds in Unicode correctly. If we want to break a string at a place which could potentially be in the middle of a multi-character fold, we back off one (or more) characters, leaving a shorter EXACTFish regnode. This backing off mechanism contained an off-by-one error. [perl #133756].

Failing to compile a format now aborts compilation. Like other errors in sub-parses this could leave the parser in a strange state, possibly crashing perl if compilation continued. [perl #132158]

If an in-place edit is still in progress during global destruction and the process exit code (as stored in $?) is zero, perl will now treat the in-place edit as successful, replacing the input file with any output produced.

Prevent the tests in ext/B/t/strict.t from being skipped. [perl #133713].

/di nodes ending or beginning in s are now EXACTF. We do not want two EXACTFU to be joined together during optimization, and to form a ss, sS, Ss or SS sequence; they are the only multi-character sequences which may match differently under /ui and /di.

SDBM_File is now more robust with corrupt database files. The improvements do not make SDBM files suitable as an interchange format. [perl #132147]

binmode($fh); or binmode($fh, ':raw'); now properly removes the :utf8 flag from the default :crlf I/O layer on Win32. [perl #133604]

If an in-place edit is still in progress during global destruction and the process exit code (as stored in $?) is zero, perl will now treat the in-place edit as successful, replacing the input file with any output produced.

On Unix-like systems supporting a platform-specific technique for determining $^X, Perl failed to fall back to the generic technique when the platform-specific one fails (for example, a Linux system with /proc not mounted). This was a regression in Perl 5.28.0. [perl #133573]

The experimental reference aliasing feature was misinterpreting array and hash slice assignment as being localised, e.g.

Perl now exposes POSIX getcwd (and on cperl the safer get_current_dir_name) as Internals::getcwd() if available. This is intended for use by Cwd.pm during bootstrapping and may be removed or changed without notice. This fixes some bootstrapping issues while building perl in a directory where some ancestor directory isn't readable. [perl #133951]

Made the gmtime_r and localtime_r fallbacks thread-safe.

Fix valid_ident() for 128-255 chars not to use isIDFIRST_A nor isIDCONT_A, _A does not match them. Fixes t/uni/method.t for chars like oslash

Fix newSVpvn_share to store the HEK_WASUTF8 flag if downgraded. Improve newSVpvn_share to downgrade only once, not twice.

A shared string and a GV with chars in the range 128-255 are downgraded to bytes without the UTF8 flag. Store at least the HEK_WASUTF8 flag then.

Check bless name under use strict 'names'.

The second argument to bless, the new classname, is now checked to be a valid package name identifier when strict 'names' is in effect, and the name is now normalized. [cperl #376]

With v5.28.0c only the declaration sub don't { 0 } was valid, it accepted the subroutine don't, but the call print don't; was invalid, it was looking for a second single-quote string delimiter. Note that in cperl ' is no perl4-style package seperator.

Fixed a Safe double-free of a XS import method in a leaf package. This really is a problem in Safe (see the outcommented code there), but the fix was easiest to do in gp_free.

gp_free in global destruction with Safe may double-free a temporary CV, like &Safe::Root0::strict::import@, i.e. with dist/Storable/t/code.t The fix is similar to the AV double-free protection of @_ in gp_free.

Fixed refs signature args, which dropped their refcnt to 0 when leaving the sub, so use-after-free stack corruption might occur. It also restored by ptr (SV**) not by value (SV*), which was unsafe when the ptr moved. [cperl #395] cperl-only relevant. perl5 uses args in @_, cperl on the stack.

Mu::new arguments (fields) are now checked for arity and type violations. Mu::new is the default cperl constructor for all class objects. See [cperl #387]

warns with 'Type of arg $bar to Foo should be int (not Str)'. cperl-only relevant.

Known Problems

The perl debugger -d mostly does not work with signatures, esp. with Test::More tests. [cperl #360]

The latest msys2 64bit gcc-9.1.0 compiler fails on two tests: op/sort.t and op/signatures.t, similar to the darwin gcc-9 where the optimizer generates wrong code in XSConfig. There are also huge performance regressions with the tree-optimizer. [cperl #397]

Don't use gcc-9.1 on x86_64.

Detect shared-only import libraries like libNAME.dll.a, which have no static counterpart libNAME.a, which happens e.g. for libffi on cygwin or msys.

Acknowledgements

cperl 5.30.0c represents approximately 10 months of development since cperl 5.28.0c and contains approximately 580,000 lines of changes across 2,400 files from 52 authors.

Excluding auto-generated files, documentation and release tools, there were approximately 410,000 lines of changes to 850 .pm, .t, .c and .h files.

The following people are known to have contributed the improvements that became cperl 5.30.0:

The list above is almost certainly incomplete as it is automatically generated from version control history including the perl and cperl repos. In particular, it does not include the names of the (very much appreciated) contributors who reported issues to the Perl bug tracker and the cperl github issues.

Many of the changes included in this version originated in the CPAN modules included in Perl's core. We're grateful to the entire CPAN community for helping Perl to flourish.

For a more complete list of all of Perl's historical contributors, please see the AUTHORS file in the Perl source distribution.

Generated with:

cperl Porting/acknowledgements.pl cperl-5.28.0..HEAD -c

Reporting Bugs

If you believe you have an unreported bug, please run the cperlbug program included with your release. Be sure to trim your bug down to a tiny but sufficient test case. Your bug report, along with the output of perl -V, will be sent off to perlbug@perl.org to be analysed by the Perl porting team.