Carp
view release on metacpan or search on metacpan
lib/Carp.pm view on Meta::CPAN
}
# UTF8_REGEXP_PROBLEM is a compile-time constant indicating whether Carp
# must avoid applying a regular expression to an upgraded (is_utf8)
# string. There are multiple problems, on different Perl versions,
# that require this to be avoided. All versions prior to 5.13.8 will
# load utf8_heavy.pl for the swash system, even if the regexp doesn't
# use character classes. Perl 5.6 and Perls [5.11.2, 5.13.11) exhibit
# specific problems when Carp is being invoked in the aftermath of a
# syntax error.
BEGIN {
if("$]" < 5.013011) {
*UTF8_REGEXP_PROBLEM = sub () { 1 };
} else {
*UTF8_REGEXP_PROBLEM = sub () { 0 };
}
}
# is_utf8() is essentially the utf8::is_utf8() function, which indicates
# whether a string is represented in the upgraded form (using UTF-8
# internally). As utf8::is_utf8() is only available from Perl 5.8
# onwards, extra effort is required here to make it work on Perl 5.6.
BEGIN {
if(defined(my $sub = _fetch_sub utf8 => 'is_utf8')) {
*is_utf8 = $sub;
} else {
# black magic for perl 5.6
*is_utf8 = sub { unpack("C", "\xaa".$_[0]) != 170 };
}
}
# The downgrade() function defined here is to be used for attempts to
# downgrade where it is acceptable to fail. It must be called with a
# second argument that is a true value.
BEGIN {
if(defined(my $sub = _fetch_sub utf8 => 'downgrade')) {
*downgrade = \&{"utf8::downgrade"};
} else {
*downgrade = sub {
my $r = "";
my $l = length($_[0]);
for(my $i = 0; $i != $l; $i++) {
my $o = ord(substr($_[0], $i, 1));
return if $o > 255;
$r .= chr($o);
}
$_[0] = $r;
};
}
}
# is_safe_printable_codepoint() indicates whether a character, specified
# by integer codepoint, is OK to output literally in a trace. Generally
# this is if it is a printable character in the ancestral character set
# (ASCII or EBCDIC). This is used on some Perls in situations where a
# regexp can't be used.
BEGIN {
*is_safe_printable_codepoint =
"$]" >= 5.007_003 ?
eval(q(sub ($) {
my $u = utf8::native_to_unicode($_[0]);
$u >= 0x20 && $u <= 0x7e;
}))
: ord("A") == 65 ?
sub ($) { $_[0] >= 0x20 && $_[0] <= 0x7e }
:
sub ($) {
# Early EBCDIC
# 3 EBCDIC code pages supported then; all controls but one
# are the code points below SPACE. The other one is 0x5F on
# POSIX-BC; FF on the other two.
# FIXME: there are plenty of unprintable codepoints other
# than those that this code and the comment above identifies
# as "controls".
$_[0] >= ord(" ") && $_[0] <= 0xff &&
$_[0] != (ord ("^") == 106 ? 0x5f : 0xff);
}
;
}
sub _univ_mod_loaded {
return 0 unless exists($::{"UNIVERSAL::"});
for ($::{"UNIVERSAL::"}) {
return 0 unless ref \$_ eq "GLOB" && *$_{HASH} && exists $$_{"$_[0]::"};
for ($$_{"$_[0]::"}) {
return 0 unless ref \$_ eq "GLOB" && *$_{HASH} && exists $$_{"VERSION"};
for ($$_{"VERSION"}) {
return 0 unless ref \$_ eq "GLOB";
return ${*$_{SCALAR}};
}
}
}
}
# _maybe_isa() is usually the UNIVERSAL::isa function. We have to avoid
# the latter if the UNIVERSAL::isa module has been loaded, to avoid infi-
# nite recursion; in that case _maybe_isa simply returns true.
my $isa;
BEGIN {
if (_univ_mod_loaded('isa')) {
*_maybe_isa = sub { 1 }
}
else {
# Since we have already done the check, record $isa for use below
# when defining _StrVal.
*_maybe_isa = $isa = _fetch_sub(UNIVERSAL => "isa");
}
}
# We need an overload::StrVal or equivalent function, but we must avoid
# loading any modules on demand, as Carp is used from __DIE__ handlers and
# may be invoked after a syntax error.
# We can copy recent implementations of overload::StrVal and use
# overloading.pm, which is the fastest implementation, so long as
# overloading is available. If it is not available, we use our own pure-
# Perl StrVal. We never actually use overload::StrVal, for various rea-
# sons described below.
# overload versions are as follows:
# undef-1.00 (up to perl 5.8.0) uses bless (avoid!)
# 1.01-1.17 (perl 5.8.1 to 5.14) uses Scalar::Util
( run in 1.276 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )