This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Carp: optimize format_arg when arguments contain many references
authorJ. Nick Koston <nick@cpanel.net>
Thu, 12 Oct 2017 06:57:36 +0000 (01:57 -0500)
committerNicolas R <atoomic@cpan.org>
Tue, 21 Nov 2017 21:36:32 +0000 (14:36 -0700)
RT #132274

This is a very minimal patch after RT discussion.
When using the CPAN version of UNIVERSAL::isa we cannot
use UNIVERSAL::isa on Carp without taking the risk of
going into one infinite loop.

As UNIVERSAL::isa on CPAN is the only one to advertise
a VERSION, we can use this value to disable the UNIVERSAL
check.

Note version bump is not required as it already occurred
since v5.27.5 release.

Signed-off-by: Nicolas R <atoomic@cpan.org>
dist/Carp/Changes
dist/Carp/lib/Carp.pm

index 0498eeb..db187e9 100644 (file)
@@ -1,3 +1,7 @@
+version 1.44
+
+  * Optimize format_arg when arguments contain many references
+
 version 1.43
 
   * fix problems introduced by the partial EBCDIC support from version
index 623558a..3c5764c 100644 (file)
@@ -283,8 +283,13 @@ sub format_arg {
     my $arg = shift;
 
     if ( ref($arg) ) {
+
+        # lazy check if the CPAN module UNIVERSAL::isa is used or not
+        #   if we use a rogue version of UNIVERSAL this would lead to infinite loop
+        my $isa = $UNIVERSAL::isa::VERSION ? sub { 1 } : \&UNIVERSAL::isa;
+
          # legitimate, let's not leak it.
-        if (!$in_recurse &&
+        if (!$in_recurse && $isa->( $arg, 'UNIVERSAL' ) &&
            do {
                 local $@;
                local $in_recurse = 1;