X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExporter.pm;h=9088a31482555bf407d3d19bad930bbe7c8b5c6d;hb=0d3cd356f86a61e8bd16da8cde1ac079d7e66290;hp=ad6cdef87e955e80f6bef0f2bc797bc8b706c023;hpb=b75c8c73cd7f3c92a16e03fb046f4e2a99363bc7;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Exporter.pm b/lib/Exporter.pm index ad6cdef..9088a31 100644 --- a/lib/Exporter.pm +++ b/lib/Exporter.pm @@ -8,7 +8,8 @@ no strict 'refs'; our $Debug = 0; our $ExportLevel = 0; our $Verbose ||= 0; -our $VERSION = '5.562'; +our $VERSION = '5.564'; +$Carp::Internal{Exporter} = 1; sub export_to_level { require Exporter::Heavy; @@ -56,7 +57,7 @@ sub import { return export $pkg, $callpkg, ($args ? @_ : ()); } local $SIG{__WARN__} = - sub {require Carp; local $Carp::CarpLevel = 1; &Carp::carp}; + sub {require Carp; &Carp::carp}; foreach my $sym (@_) { # shortcut for the common case of no type character *{"$callpkg\::$sym"} = \&{"$pkg\::$sym"}; @@ -307,4 +308,35 @@ unchanged but will trigger a warning (with C<-w>) to avoid misspelt tags names being silently added to @EXPORT or @EXPORT_OK. Future versions may make this a fatal error. +=head2 Ced Constants + +Many modules make use of Cing for constant subroutines to +avoid having to compile and waste memory on rarely used values (see +L for details on constant subroutines). Calls to such +constant subroutines are not optimized away at compile time because +they can't be checked at compile time for constancy. + +Even if a prototype is available at compile time, the body of the +subroutine is not (it hasn't been Ced yet). perl needs to +examine both the C<()> prototype and the body of a subroutine at +compile time to detect that it can safely replace calls to that +subroutine with the constant value. + +A workaround for this is to call the constants once in a C block: + + package My ; + + use Socket ; + + foo( SO_LINGER ); ## SO_LINGER NOT optimized away; called at runtime + BEGIN { SO_LINGER } + foo( SO_LINGER ); ## SO_LINGER optimized away at compile time. + +This forces the C for C to take place before +SO_LINGER is encountered later in C package. + +If you are writing a package that Cs, consider forcing +an C for any constants explicitly imported by other packages +or which are usually used when your package is Cd. + =cut