Sun Aug 02 00:48:42 2015: Request 106142 was acted upon.
Transaction: Correspondence added by SLAFFAN
       Queue: Module-ScanDeps
     Subject: [Patch] Preload dependencies for PDL and PDL::NiceSlice
   Broken in: (no value)
    Severity: (no value)
       Owner: Nobody
  Requestors: slaf...@cpan.org
      Status: open
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=106142 >


On Wed Jul 29 17:50:53 2015, SLAFFAN wrote:
> Thanks.  The PDL::NiceSlice approach is much simpler.
> 
> If I can get a chance I'll look into the PDL code to see what sort of
> calls are used.
> 
> Regards,
> Shawn.
> 
> 
> On Wed Jul 29 11:23:33 2015, RSCHUPP wrote:
> > On 2015-07-29 07:50:35, SLAFFAN wrote:
> >
> > > use PDL;
> > > use PDL::NiceSlice;
> > >  my $x = pdl [[2,3,4],[1,2,3]];
> > > print $x(1,);
> > > print $x;
> >
> >
> > I agree on the %Preload rule for PDL/NiceSlice.pm, it can be made
> > more
> > robust as
> >
> > 'PDL/NiceSlice.pm' => 'sub',
> >
> > but the rule for PDL.pm needs further investigation. Somehow
> > utf8_heavy.pl is
> > needed... Maybe this was caused by rev 1501 in
> > https://www.openfoundry.org/svn/par
> >  when I removed the scan rule that says
> >
> > Foo::Bar::quux(...)
> >
> > or
> >
> > Foo::Bar->quux(...)
> >
> > implies we should add a dependency on Foo::Bar.
> >
> > Cheers, Roderich
> >
> >


It looks like the change in rev 1501 is not the cause.  I modified the regexp 
to use a negative lookbehind to avoid false positives on $foo->bar->baz, and 
added it into scan_chunk, but utf8_heavy.pl was not packed.  I did not check 
for Foo::Bar::baz(), though.

return $1 if (/(?<!\W) \b (\w+(?:::\w+)*) \s* (?:->)/x and $1 ne 'Tk' and $1 ne 
'shift' and $1 ne '__PACKAGE__');

A bit of further searching through the PDL code indicated File::Map was a 
pinch-point, so I added some more Preload rules as a check (see below).  These 
seem to work, but need further investigation since they are not generalised.

File::Map is loaded in PDL::Core, PDL::IO::FlexRaw and PDL::IO::FastRaw using a 
string eval.   From PDL::Core:

eval 'use File::Map 0.47 qw(:all)';


As a quick experiment, I added the following preload rules to Module::ScanDeps. 
 The explicit listing of unicore/Heavy.pl is needed because it is not found 
through the utf8.pm preload sub.  I am sure there is a better way, but maybe 
this helps locate the source of the problem?


    'File/Map.pm' => ['utf8.pm', 'unicore/Heavy.pl'],
    'PDL'         => ['PDL/Core.pm'],
    'PDL/Core.pm' => ['File/Map.pm'],


When I then run pp on the script below, explicitly loading File:Map, the packed 
executable works.

use PDL;
use File::Map;
my $x = pdl [[2,3,4],[1, 2, 3]]; 
print $x;


However, if I comment out the 'use File::Map' line it does not pack 
utf8_heavy.pl, so the preload rules above are clearly wrong.

Instrumenting _glob_in_inc to print to stdout whenever unico[rd]e is passed as 
the subdir argument has no effect, so I assume the utf8.pm preload sub is not 
being run for the above preload rules.


Hopefully the above is helpful.  

Regards,
Shawn.


Reply via email to