From: Barrie Slaymaker Date: Wed, 28 Nov 2001 14:10:01 +0000 (-0500) Subject: Explain dangers & workaround for AUTOLOADed constant subs X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5fea0f12373ae6f6aa140f470ee71f3ef680c14b;p=p5sagit%2Fp5-mst-13.2.git Explain dangers & workaround for AUTOLOADed constant subs Message-ID: <20011128140957.D5236@sizzle.whoville.com> p4raw-id: //depot/perl@13347 --- diff --git a/lib/Exporter.pm b/lib/Exporter.pm index 9a361a7..7067464 100644 --- a/lib/Exporter.pm +++ b/lib/Exporter.pm @@ -307,4 +307,34 @@ 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