From: Tels Date: Thu, 29 Nov 2001 07:28:10 +0000 (+0100) Subject: Re: [PATCH Exporter.pm] Explain dangers & workaround for AUTOLOADed constant subs X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=8b4c0206050ea137d8e8f896aabe9e7179812197;p=p5sagit%2Fp5-mst-13.2.git Re: [PATCH Exporter.pm] Explain dangers & workaround for AUTOLOADed constant subs Message-Id: <200111290630.IAA08631@tiku.hut.fi> (plus paragraph rewrapping) p4raw-id: //depot/perl@13356 --- diff --git a/lib/Exporter.pm b/lib/Exporter.pm index 7067464..ce89c59 100644 --- a/lib/Exporter.pm +++ b/lib/Exporter.pm @@ -309,16 +309,17 @@ 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. +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: @@ -330,11 +331,11 @@ A workaround for this is to call the constants once in a C block: 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. +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. +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