Re: An Inline question, and a user's experience: Fwd: Using Inline::CPP and Math::Primes::FastSieve

[email protected] ("Sisyphus")
Newsgroups perl.inline
Message-ID <94B11F2DE13F4FF8AE5EE480568CC2E1@desktop2>
----- Original Message ----- 
From: "David Oswald"

> I get the Inline M51 warning (DATA section not used) if anyone does a
> require on my module. I realize this is a harmless warning, but I
> really don't want it happening to my module when I don't even use
> Inline. So for now I've disabled use of MPFS to avoid it.
>
> <snip>------------------------------------------------
>
> That message is coming from Inline, but I can't figure out how one
> might squelch it.  Are there any suggestions that might help here?

Found the time to have a further look tonight.

It all happens in this section of Inline.pm:

######################################################
#==============================================================================
# Process delayed objects that don't have source code yet.
#==============================================================================
# This code is an ugly hack because of the fact that you can't use an
# INIT block at "run-time proper". So we kill the warning for 5.6+ users
# and tell them to use a Inline->init() call if they run into problems. 
(rare)
my $lexwarn = ($] >= 5.006) ? 'no warnings;' : '';

eval <<END;
$lexwarn
\$INIT = \$INIT; # Needed by Sarathy's patch.
sub INIT {
    \$INIT++;
    &init;
}
END

sub init {
    local ($/, $") = ("\n", ' '); local ($\, $,);

    while (my $o = shift(@DATA_OBJS)) {
 $o->read_DATA;
 $o->glue;
    }
}

sub END {
    warn M51_unused_DATA() if @DATA_OBJS;
    print_version() if $version_requested && not $version_printed;
}

#######################################################

If @DATA_OBJS doesn't get emptied out then you get the M51 warning.

If you "require" Math::Prime::FastSieve, sub INIT does not get called 
(because INIT blocks can only be executed *before* runtime), therefore sub 
init doesn't get called, therefore @DATA_OBJS doesn't get emptied, therefore 
you get the M51 warning.

One solution is to take the advice offered in the comments in the above code 
and have FastSieve.pm do:

Inline->init();

(immediately prior to the closing '1;' seems to suffice).

I'm a bit nervous about messing too much with this code - I don't know what 
"Sarathy's patch" is, or why it needs the line of code that is claimed to be 
necessary. I've no idea why it does '\$INIT++;' (or even why $INIT has to 
exist) and I don't really know much about how that code fits in to the 
general scheme.

It's clear that $lexwarn can now be removed and replaced by an unconditional 
'no warnings;' at the begining of the eval() ... and I'll do that.

For the moment, I think I'll just document the 'Inline->init()' solution, 
and leave it at that.

Eventually I'd like to think that I'll get around to poking and prodding a 
bit, and try to come up with a better way of silencing the M51 warning when 
an Inline module is "required". (If someone else gets to it before I do, 
then that's all the better :-)

Cheers,
Rob

PS If it's not obvious, the reason that 'use Math::Prime::FastSieve;' does 
*not* produce the same
warning is that loading with "use" enables the INIT sub to get run (straight 
after compile-time,
and before runtime). Therefore, @DATA_OBJS gets emptied out, and the M51 
warning is avoided.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.