perl5 icon indicating copy to clipboard operation
perl5 copied to clipboard

CvFILE on threaded, and gv_fetchfile on all perls, burn mad memory

Open p5pRT opened this issue 10 years ago • 55 comments

Migrated from rt.perl.org#125296 (status was 'open')

Searchable as RT125296$

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

Created by @bulk88

commit a636914a235cd8650ed6efcb07e302c0332fa638 "Re​: CvFILE corruption under ithreads" from 5.7.1 from 2001 drastically increased memory usage of threaded perl.

Using "perl -e"system pause; require Test​::More; system 'pause'"" as a benchmark, and procdump, strings @​8 chars, diff, then manually removing sensitive information (user32/gdi32 shared memory with passwords from long gone GUI apps) produced the 2 logs (attached later in this ticket). You can see that each PP sub creates a unique copy of the absolute file path. ----------------------------------------------------------------- 05/28/2015 05​:21 PM 11,819,415 perl.exe_nothd_af.dmp 05/28/2015 05​:21 PM 10,832,263 perl.exe_nothd_b4.dmp 05/28/2015 05​:35 PM 12,069,271 perl.exe_thd_af.dmp 05/28/2015 05​:34 PM 10,910,087 perl.exe_thd_b4.dmp -----------------------------------------------------------------

unthreaded took 11,819,415-10,832,263=987,152 bytes of memory. threaded took 12,069,271-10,910,087=1,159,184 bytes of memory

1,159,184-987,152=172,032 bytes of memory.

So threaded takes 172KB or 17% more memory to load the same Perl module. Some more processing of the diff shows 1503 instances of new "+C​:/" paths, it comes to 63988 bytes of extra file paths, (attached later). This file excludes alignment roundup+libc malloc headers+perl malloc headers. 63988-(1503*1)<CRLF to NULL byte>+(1503*8)<Win32 32 bit malloc header>+(1503*12)<Perl's vmem.h on 32 bits>+(1503*4)<average alighnment roundup to 8 on win32-32>. Adding all of that comes to 98557 bytes of file paths as a rough estimate.

Reverting ("#define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = CopFILE(cop), CvDYNFILE_off(sv))") commit a636914a235cd8650ed6efcb07e302c0332fa638 "Re​: CvFILE corruption under ithreads" causes causes mem corruption (use after free) and some test fails (I am using PERL_POISON+Win32 Debugging Heap (gflags) on the whole smoke). Here is the test fails. More tests fail individually when I run them with Dr Memory.

----------------------------------------------------------------- Test Summary Report ------------------- op/stash.t (Wstat​: 0 Tests​: 51 Failed​: 1)   Failed test​: 35 uni/stash.t (Wstat​: 0 Tests​: 49 Failed​: 1)   Failed test​: 36 ../ext/Devel-Peek/t/Peek.t (Wstat​: 768 Test s​: 114 Failed​: 3)   Failed tests​: 25, 27, 51   Non-zero exit status​: 3 Files=2385, Tests=697642, 5307 wallclock secs (257.47 usr + 7.23 sys = 264.70 C PU) Result​: FAIL b88dmake​: Error code 181, while making 'test' -----------------------------------------------------------------

Dr Memory on op/stash.t shows failures like ----------------------------------------------------------------- Error #1​: UNADDRESSABLE ACCESS​: reading 0x1161539c-0x1161539d 1 byte(s) # 0 replace_strlen
[d​:\drmemory_package\drmemory\replace.c​:375] # 1 perl522.dll!Perl_newSVpv [c​:\perl521\srcnewb4opt\sv.c​:9215] # 2 B.dll!XS_B__IV_IVX [c​:\perl521\srcnewb4opt\ext\b\b.xs​:1676] # 3 perl522.dll!Perl_pp_entersub [c​:\perl521\srcnewb4opt\pp_hot.c​:3268] # 4 perl522.dll!Perl_runops_debug [c​:\perl521\srcnewb4opt\dump.c​:2234] # 5 perl522.dll!S_run_body
[c​:\perl521\srcnewb4opt\win32\perl.c​:2451] # 6 perl522.dll!perl_run
[c​:\perl521\srcnewb4opt\win32\perl.c​:2374] # 7 perl522.dll!RunPerl
[c​:\perl521\srcnewb4opt\win32\perllib.c​:258] # 8 main
[c​:\perl521\srcnewb4opt\win32\perlmain.c​:39] -----------------------------------------------------------------

CvFILE is either a pointer to malloc freed sentinel pattern, or some other perl src code file in the .t process and therefore the tests fail.

CvFILE always comes from CopFILE(), but CopFILE() is very different on threads and unthreaded because of the "no SV*s in OPs due to shared OP/OP COW" limitation.

threaded ----------------------------------------------------------------- # define CopFILE(c) ((c)->cop_file) ----------------------------------------------------------------- unthreaded ----------------------------------------------------------------- # define CopFILE(c) (CopFILEGV(c) \   ? GvNAME(CopFILEGV(c))+2 : NULL) ----------------------------------------------------------------- a section of the COP struct ----------------------------------------------------------------- #ifdef USE_ITHREADS   PADOFFSET cop_stashoff; /* offset into PL_stashpad, for the   package the line was compiled in */   char * cop_file; /* file name the following line # is from */ #else   HV * cop_stash; /* package line was compiled in */   GV * cop_filegv; /* file the following line # is from */ #endif ----------------------------------------------------------------- The current design of CvFILE on threads has to change. I am currrently experimenting with only selectivly using "savepv(CopFILE(cop)), CvDYNFILE_on(sv))". It seems to me (and Im not a optree expert) 99% of the time, the filename is available in the 1st op of the sub, which is a pp_nextstate. Predeclared subs have CV*s, but CvSTART and CvROOT are null, so in Perl_newSTUB a savepv() is required. The PL_curcop filename is freed on savestack with ----------------------------------------------------------------- Note​: # 0 replace_free
[d​:\drmemory_package\common\alloc_replace.c​:2380] Note​: # 1 perl522.dll!VMem​::Free
[c​:\perl521\srcnewb4opt\win32\vmem.h​:213] Note​: # 2 perl522.dll!CPerlHost​::FreeShared
[c​:\perl521\srcnewb4opt\win32\perlhost.h​:101] Note​: # 3 perl522.dll!PerlMemSharedFree
[c​:\perl521\srcnewb4opt\win32\perlhost.h​:360] Note​: # 4 perl522.dll!Perl_leave_scope
[c​:\perl521\srcnewb4opt\scope.c​:852] Note​: # 5 perl522.dll!Perl_pop_scope
[c​:\perl521\srcnewb4opt\scope.c​:104] Note​: # 6 perl522.dll!Perl_pp_leaveeval
[c​:\perl521\srcnewb4opt\pp_ctl.c​:4368] Note​: # 7 perl522.dll!Perl_runops_debug
[c​:\perl521\srcnewb4opt\dump.c​:2234] Note​: # 8 perl522.dll!S_run_body
[c​:\perl521\srcnewb4opt\win32\perl.c​:2451] Note​: # 9 perl522.dll!perl_run
[c​:\perl521\srcnewb4opt\win32\perl.c​:2374] Note​: #10 perl522.dll!RunPerl
[c​:\perl521\srcnewb4opt\win32\perllib.c​:258] Note​: #11 main
[c​:\perl521\srcnewb4opt\win32\perlmain.c​:39] ----------------------------------------------------------------- callstack.

Another idea proposed in http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html was to eliminate CvFILE entirely since its value is not used by PP code. There will be breakage on CPAN to remove CvFILE http​://grep. cpan. me/?q=CvFILE but all the CvFILE uses are either to print debugging info to a human, or setting CvFILE to maintain perlapi compatibility since core does that. This would save a ptr slot in the CV body plus the malloc. Here are the usages that look most, "interesting" to me.

https://metacpan.org/source/MLEHMANN/Devel-FindRef-1.44/FindRef.xs#L204 https://metacpan.org/source/NWCLARK/Devel-Arena-0.23/Arena.xs#L453 https://metacpan.org/source/RGARCIA/Sub-Identify-0.10/Identify.xs#L49

Another idea is, change CvFILE slot in the CV body to be HEK * owned or GV * (gv_fetchfile's GV*) un/owned by the CV * instead of the current unowned static char * for XS, or the malloced char * for PP.

That also brings up, why does gv_fetchfile exist to create typeglobs like this hand trimmed of non "_<" entries list? What use do these GVs have? ----------------------------------------------------------------- C​:\Documents and Settings\Owner>perl -e"$,=\"\n\", print keys%main​::" _<perl.c _<.\win32.c _<..\universal.c _<-e _<perllib.c _<..\perlio.c _<..\mro_core.c _<Win32CORE.c C​:\Documents and Settings\Owner> -----------------------------------------------------------------

Or ----------------------------------------------------------------- C​:\Documents and Settings\Owner>perl -e"require Test​::Harness; $,=\"\n\", print keys%main​::" _<C​:/perl521/lib/strict.pm _<C​:/perl521/lib/auto/Time/HiRes/HiRes.dll _<C​:/perl521/lib/auto/Fcntl/Fcntl.dll _<..\universal.c _<C​:/perl521/lib/XSLoader.pm _<C​:/perl521/lib/auto/IO/IO.dll _<Cwd.c _<-e _<C​:/perl521/lib/base.pm _<C​:/perl521/lib/auto/POSIX/POSIX.dll _<Win32CORE.c _<POSIX.xs _<perllib.c _<C​:/perl521/lib/warnings.pm _<C​:/perl521/lib/Carp.pm _<C​:/perl521/lib/auto/Cwd/Cwd.dll _<C​:/perl521/site/lib/TAP/Parser/IteratorFactory.pm _<..\mro_core.c _<.\win32.c _<DynaLoader.c _<HiRes.c _<perl.c _<POSIX.c _<Fcntl.c _<IO.c _<..\perlio.c C​:\Documents and Settings\Owner> -----------------------------------------------------------------

Even worse, these GVs have a SV * inside, with YET another unique copy of the filename (see later attached pic, gp_file_hek is the 1st copy, the SV * in the GV* is another copy, different pointers). ----------------------------------------------------------------- C​:\Documents and Settings\Owner>perl -e"require Test​::Harness; require Devel​::Pe ek; Devel​::Peek​::Dump(*{'_<C​:/perl521/lib/strict.pm'})" SV = PVGV(0x90032c) at 0x9119f4   REFCNT = 1   FLAGS = (MULTI)   NAME = "_<C​:/perl521/lib/strict.pm"   NAMELEN = 26   GvSTASH = 0x3680f4 "main"   FLAGS = 0x2   GP = 0x914f7c   SV = 0x911a04   REFCNT = 1   IO = 0x0   FORM = 0x0   AV = 0x0   HV = 0x0   CV = 0x0   CVGEN = 0x0   GPFLAGS = 0x0 ()   LINE = 14   FILE = "C​:/perl521/lib/strict.pm"   EGV = 0x9119f4 "_<C​:/perl521/lib/strict.pm"

C​:\Documents and Settings\Owner>perl -e"require Test​::Harness; require Devel​::Pe ek; Devel​::Peek​::Dump(*{'_<C​:/perl521/lib/strict.pm'}{SCALAR})" SV = IV(0x3681f8) at 0x3681fc   REFCNT = 1   FLAGS = (TEMP,ROK)   RV = 0x911d3c   SV = PV(0x36906c) at 0x911d3c   REFCNT = 2   FLAGS = (POK,pPOK)   PV = 0x91527c "C​:/perl521/lib/strict.pm"\0   CUR = 24   LEN = 26

C​:\Documents and Settings\Owner> ----------------------------------------------------------------- While threaded perl wastes memory much worse than unthreaded. Unthreaded still has 3 copies of the file path for every .pm file in memory (see later attached). I guess I'll have to newSVpvn_share that, or something else, since I do have a HEK* already from the GV, which is an easy fix.

Now note, I have not said there are any memory leaks, it is just that threaded Perl burns memory like an oil tycoon setting pallets of money on fire. All this code (file path storage) could only have been designed by a monkey house and has to change, to something else. Exactly what, is why I filed this ticket.

Perl Info

Flags:
    category=core
    severity=high

Site configuration information for perl 5.22.0:

Configured by Owner at Thu May 28 17:26:18 2015.

Summary of my perl5 (revision 5 version 22 subversion 0) configuration:
  Commit id: db8192ecf78d7f18a7fdbcc047f3dad0577bb287
  Platform:
    osname=MSWin32, osvers=5.1, archname=MSWin32-x86-multi-thread
    uname=''
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    useithreads=define, usemultiplicity=define
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cl', ccflags ='-nologo -GF -W3 -O1 -MD -Zi -DNDEBUG -GL -DWIN32 
-D_CONSOLE -DNO_STRICT  -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT 
-DPERL_IMPLICIT_SYS -D_USE_32BIT_TIME_T',
    optimize='-O1 -MD -Zi -DNDEBUG -GL',
    cppflags='-DWIN32'
    ccversion='13.10.6030', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234, 
doublekind=3
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=8, 
longdblkind=0
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', 
lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf -ltcg 
        -libpath:"c:\perl\lib\CORE"         -machine:x86'
    libpth=\lib
    libs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib 
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib 
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib 
odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
    perllibs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib 
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib 
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib 
odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
    libc=msvcrt.lib, so=dll, useshrplib=true, libperl=perl522.lib
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug 
-opt:ref,icf -ltcg         -libpath:"c:\perl\lib\CORE"         -machine:x86'

Locally applied patches:
    RC2


@INC for perl 5.22.0:
    C:/perl521/srcnewb4opt/lib
    .


Environment for perl 5.22.0:
    HOME (unset)
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=C:\sperl\c\bin;C:\perl521\bin;C:\WINDOWS\system32;C:\Program 
Files\Microsoft Visual Studio .NET 2003\Vc7\bin;C:\Program 
Files\Microsoft Visual Studio .NET 
2003\Common7\IDE;C:\WINDOWS;C:\Program Files\Git\cmd;C:\Program 
Files\Microsoft Visual Studio .NET 2003\Common7\Tools\bin;C:\perl\bin;
    PERL_BADLANG (unset)
    PERL_JSON_BACKEND=Cpanel::JSON::XS
    PERL_YAML_BACKEND=YAML::XS
    SHELL (unset)


p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

monkey_burning_money.jpg

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

On Sat May 30 16​:29​:09 2015, bulk88 wrote​:

attachments, probably won't make it to the ML due to 250 KB limit

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

filenameGV.PNG

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

perl.exe_nothd.diff

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

+C​:/perl521/srcnewb4opt/lib/Test/More.pm +C​:/perl521/srcnewb4opt/lib/Test/More.pm +C​:/perl521/srcnewb4opt/lib/Test/Builder.pm +C​:/perl521/srcnewb4opt/lib/Test/More.pm +C​:/perl521/srcnewb4opt/lib/Test/Builder.pm +C​:/perl521/srcnewb4opt/lib/strict.pm +C​:/perl521/srcnewb4opt/lib/strict.pm +C​:/perl521/srcnewb4opt/lib/warnings.pm +C​:/perl521/srcnewb4opt/lib/Test/Builder.pm +C​:/perl521/srcnewb4opt/lib/strict.pm +C​:/perl521/srcnewb4opt/lib/vars.pm +C​:/perl521/srcnewb4opt/lib/warnings.pm +C​:/perl521/srcnewb4opt/lib/strict.pm +C​:/perl521/srcnewb4opt/lib/strict.pm +C​:/perl521/srcnewb4opt/lib/warnings.pm +C​:/perl521/srcnewb4opt/lib/Config.pm +C​:/perl521/srcnewb4opt/lib/Exporter.pm +C​:/perl521/srcnewb4opt/lib/Config.pm +C​:/perl521/srcnewb4opt/lib/Config.pm +C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm +C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm +C​:/perl521/srcnewb4opt/lib/vars.pm +C​:/perl521/srcnewb4opt/lib/vars.pm +C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm +C​:/perl521/srcnewb4opt/lib/warnings/register.pm +C​:/perl521/srcnewb4opt/lib/warnings/register.pm +C​:/perl521/srcnewb4opt/lib/warnings/register.pm +C​:/perl521/srcnewb4opt/lib/PerlIO.pm +C​:/perl521/srcnewb4opt/lib/PerlIO.pm +C​:/perl521/srcnewb4opt/lib/PerlIO.pm +C​:/perl521/srcnewb4opt/lib/PerlIO.pm +C​:/perl521/srcnewb4opt/lib/Exporter.pm +C​:/perl521/srcnewb4opt/lib/Exporter.pm

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

perl.exe_thd.diff

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/strict.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/warnings.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/warnings/register.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/vars.pm C​:/perl521/srcnewb4opt/lib/Config.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/Test/Builder.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/PerlIO.pm C​:/perl521/srcnewb4opt/lib/Test/Builder/Module.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Exporter.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm C​:/perl521/srcnewb4opt/lib/Test/More.pm

p5pRT avatar May 30 '15 23:05 p5pRT

From @bulk88

Since noone has had any comments, here is a concept patch to remove CvFILE as suggested by http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html This patch doesn't address CopFILE on threaded and its bloat.

Test Summary Report


../lib/B/Deparse.t (Wstat​: 0 Tests​: 245 Failed​: 3)   Failed tests​: 226, 230-231 Files=2390, Tests=712425, 1394 wallclock secs (67.19 usr + 3.88 sys = 71.06 CPU ) Result​: FAIL b88-dmake​: Error code 131, while making 'test'

Deparse failures.

ok 224 - no extra output when deparsing foo() ok 225 - sub calls compiled before importation of prototype subs # Failed test 226 - [perl \#121050] prototypes with whitespace at ../lib/B/Depar se.t line 345 # got "&_121050(\\$a, \\$b);\n() = &_121050empty() + 1;\n" # expected "sub _121050 (\\$ \\$) {\n \n}\n_121050 $a, $b;\nsub _121050empty ( ) {\n \n}\n() = _121050empty + 1;\n" not ok 226 - [perl \#121050] prototypes with whitespace ok 227 - CORE​::no after my sub no ok 228 - CORE​::use after my sub use

Zefram on IRC said those 2 above are functionally identical.

ok 228 - CORE​::use after my sub use ok 229 - CORE​::__DATA__ after my sub __DATA__ # Failed test 230 - sub declarations at ../lib/B/Deparse.t line 384 # got '-e syntax OK # ' # expected /(?^​:sub foo\s*\{\s+\})/ not ok 230 - sub declarations # Failed test 231 - predeclared prototyped subs at ../lib/B/Deparse.t line 385 # got '' # expected /(?^​:sub f\s*\(\$\)\s*\{\s*\})/ not ok 231 - predeclared prototyped subs ok 232 - prototyped stub with weak reference to the stash entry ok 233 - constant perl sub declaration

The failures are all related to the todo sub in Deparse.pm. Sub todo is called like this, but I dont understand its purpise enough to say what it does.

  B​::Deparse​::todo(B​::Deparse=HASH(0xad8ac4), B​::CV=SCALAR(0xc06d34), 0) c alled at ../lib/B/Deparse.pm line 775   B​::Deparse​::stash_subs(B​::Deparse=HASH(0xad8ac4), "utf8​::", HASH(0xceeb8 c)) called at ../lib/B/Deparse.pm line 782   B​::Deparse​::stash_subs(B​::Deparse=HASH(0xad8ac4)) called at ../lib/B/Dep arse.pm line 932   B​::Deparse​::__ANON__() called at (eval 2) line 31   O​::CHECK() called at -e line 0   eval {...} called at -e line 0

The failures (specifically I am talking about test 226 " [perl \#121050] prototypes with whitespace") seem to be caused by CVs without GVs. Commit http​://perl5.git.perl.org/perl.git/commitdiff/b290562ef436d5316a2f75513def7f4f18c4ef34 "Allow CVs to point to HEKs rather than GVs" by Father C created the scenario where some CVs dont have GVs anymore. Test 226 is such a CV. In test 226 when $cv->GV executes in B, it vivifys the GV, and the GV gets the FILE and LINE from inside sub todo from Deparse.pm. I think that B​::CV​::GV should not be vivifying things. A getter should not be changing state. Before ->GV is called, CVf_NAMED is on, after ->GV() it is off. Since the GV doesn't exist for test 226, I got the idea, if the CV is a CVf_NAMED CV, use the FILE from the GV that holds the stash HV, it should usually be correct (unless you are create subs from a different .pm than the formal .pm for that package). I did a svref_2object(\*{$cv->STASH->NAME.'​::'}->FILE but test 226 still failed since FILE was empty string and not "-e" AKA $O.


C​:\perl521\srcnewb4opt\t>perl -I../lib -MB -E" say B​::svref_2object(\*{'main'})-

FILE" -e

C​:\perl521\srcnewb4opt\t>perl -I../lib -MB -E" say B​::svref_2object(\*{'main​::'} )->FILE"


But notice main​:: has no FILE, that is because PL_curcop->cop_file/cop_filegv is NULL at the time main is created in S_init_main_stash. I guess S_parse_body could be modified to change the creation location file of main to curcop, but I stopped at this point before investing more time.

Another conceptual flaw with CvFILE is, where is the line number where the CV was created? What about PP? What about XS (too late to change newXS?) Is it a waste to store line number? Is it a waste to store CvFILE? Like with GVs, if you will store the file, you have to store the line. CvFILE is almost useless as a debugging aid otherwise.

Should CVf_NAMED and related code be removed since it removes the GVs which store creation location?

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Jul 07 '15 07:07 p5pRT

From @bulk88

0001-WIP-remove-CvFILE.patch
From 6c737e3bd8b7626a5caf5401db7279421bfdbdcc Mon Sep 17 00:00:00 2001
From: Daniel Dragan <[email protected]>
Date: Tue, 7 Jul 2015 01:43:39 -0400
Subject: [PATCH] WIP remove CvFILE

---
 cv.h                    |    6 +++++-
 dump.c                  |    4 ++--
 ext/B/B.xs              |    4 ++--
 ext/Devel-Peek/t/Peek.t |   34 +++++++++++++++-------------------
 gv.c                    |    2 +-
 lib/B/Deparse.pm        |    6 ++++--
 op.c                    |   47 +++++++++++++++++++++++++++++------------------
 pad.c                   |    5 +++++
 perl.c                  |   29 ++++++++++++++++-------------
 sv.c                    |    2 ++
 sv.h                    |    1 -
 t/op/stash.t            |    8 +-------
 t/uni/stash.t           |    4 +---
 universal.c             |    2 ++
 14 files changed, 85 insertions(+), 69 deletions(-)

diff --git a/cv.h b/cv.h
index d4dfd2d..31b88d9 100644
--- a/cv.h
+++ b/cv.h
@@ -52,6 +52,7 @@ See L<perlguts/Autoloading with XSUBs>.
 #define CvGV(sv)	S_CvGV(aTHX_ (CV *)(sv))
 #define CvGV_set(cv,gv)	Perl_cvgv_set(aTHX_ cv, gv)
 #define CvHASGV(cv)	cBOOL(SvANY(cv)->xcv_gv_u.xcv_gv)
+/*
 #define CvFILE(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file
 #ifdef USE_ITHREADS
 #  define CvFILE_set_from_cop(sv, cop)	\
@@ -61,6 +62,7 @@ See L<perlguts/Autoloading with XSUBs>.
     (CvFILE(sv) = CopFILE(cop), CvDYNFILE_off(sv))
 #endif
 #define CvFILEGV(sv)	(gv_fetchfile(CvFILE(sv)))
+*/
 #define CvDEPTH(sv)	(*S_CvDEPTHp((const CV *)sv))
 /* For use when you only have a XPVCV*, not a real CV*.
    Must be assert protected as in S_CvDEPTHp before use. */
@@ -129,7 +131,7 @@ See L<perlguts/Autoloading with XSUBs>.
 #ifdef PERL_CORE
 # define CVf_SLABBED	0x0800	/* Holds refcount on op slab  */
 #endif
-#define CVf_DYNFILE	0x1000	/* The filename isn't static  */
+/*# define CVf_DYNFILE	0x1000	/* The filename isn't static  */
 #define CVf_AUTOLOAD	0x2000	/* SvPVX contains AUTOLOADed sub name  */
 #define CVf_HASEVAL	0x4000	/* contains string eval  */
 #define CVf_NAMED	0x8000  /* Has a name HEK */
@@ -200,9 +202,11 @@ See L<perlguts/Autoloading with XSUBs>.
 # define CvSLABBED_off(cv)	(CvFLAGS(cv) &= ~CVf_SLABBED)
 #endif
 
+/*
 #define CvDYNFILE(cv)		(CvFLAGS(cv) & CVf_DYNFILE)
 #define CvDYNFILE_on(cv)	(CvFLAGS(cv) |= CVf_DYNFILE)
 #define CvDYNFILE_off(cv)	(CvFLAGS(cv) &= ~CVf_DYNFILE)
+*/
 
 #define CvAUTOLOAD(cv)		(CvFLAGS(cv) & CVf_AUTOLOAD)
 #define CvAUTOLOAD_on(cv)	(CvFLAGS(cv) |= CVf_AUTOLOAD)
diff --git a/dump.c b/dump.c
index c4d4018..33bb53a 100644
--- a/dump.c
+++ b/dump.c
@@ -1345,7 +1345,7 @@ const struct flag_to_name cv_flags_names[] = {
     {CVf_METHOD, "METHOD,"},
     {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"},
     {CVf_CVGV_RC, "CVGV_RC,"},
-    {CVf_DYNFILE, "DYNFILE,"},
+/*    {CVf_DYNFILE, "DYNFILE,"}, */
     {CVf_AUTOLOAD, "AUTOLOAD,"},
     {CVf_HASEVAL, "HASEVAL,"},
     {CVf_SLABBED, "SLABBED,"},
@@ -1960,7 +1960,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
 	    Perl_dump_indent(aTHX_ level, file, "  NAME = \"%s\"\n",
 				   HEK_KEY(CvNAME_HEK((CV *)sv)));
 	else do_gvgv_dump(level, file, "  GVGV::GV", CvGV(sv));
-	Perl_dump_indent(aTHX_ level, file, "  FILE = \"%s\"\n", CvFILE(sv));
+/*	Perl_dump_indent(aTHX_ level, file, "  FILE = \"%s\"\n", CvFILE(sv)); */
 	Perl_dump_indent(aTHX_ level, file, "  DEPTH = %"IVdf"\n", (IV)CvDEPTH(sv));
 	Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%"UVxf"\n", (UV)CvFLAGS(sv));
 	Perl_dump_indent(aTHX_ level, file, "  OUTSIDE_SEQ = %"UVuf"\n", (UV)CvOUTSIDE_SEQ(sv));
diff --git a/ext/B/B.xs b/ext/B/B.xs
index 348a60a..c5eeae6 100644
--- a/ext/B/B.xs
+++ b/ext/B/B.xs
@@ -1594,7 +1594,7 @@ MODULE = B	PACKAGE = B::IV
 #else
 # define PVCV_gv_ix	sv_SVp | STRUCT_OFFSET(struct xpvcv, xcv_gv)
 #endif
-#define PVCV_file_ix	sv_char_pp | STRUCT_OFFSET(struct xpvcv, xcv_file)
+# /* #define PVCV_file_ix	sv_char_pp | STRUCT_OFFSET(struct xpvcv, xcv_file) */
 #define PVCV_outside_ix	sv_SVp | STRUCT_OFFSET(struct xpvcv, xcv_outside)
 #define PVCV_outside_seq_ix sv_U32p | STRUCT_OFFSET(struct xpvcv, xcv_outside_seq)
 #define PVCV_flags_ix	sv_U32p | STRUCT_OFFSET(struct xpvcv, xcv_flags)
@@ -1641,7 +1641,7 @@ IVX(sv)
 	B::IO::IoFLAGS = PVIO_flags_ix
 	B::AV::MAX = PVAV_max_ix
 	B::CV::STASH = PVCV_stash_ix
-	B::CV::FILE = PVCV_file_ix
+#	B::CV::FILE = PVCV_file_ix
 	B::CV::OUTSIDE = PVCV_outside_ix
 	B::CV::OUTSIDE_SEQ = PVCV_outside_seq_ix
 	B::CV::CvFLAGS = PVCV_flags_ix
diff --git a/ext/Devel-Peek/t/Peek.t b/ext/Devel-Peek/t/Peek.t
index 56522af..6d56462 100644
--- a/ext/Devel-Peek/t/Peek.t
+++ b/ext/Devel-Peek/t/Peek.t
@@ -298,19 +298,18 @@ do_test('reference to anon sub with empty prototype',
   RV = $ADDR
   SV = PVCV\\($ADDR\\) at $ADDR
     REFCNT = 2
-    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC\\) # $] < 5.015 || !thr
-    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC,DYNFILE\\) # $] >= 5.015 && thr
+    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC\\) # $] < 5.015 || !thr || $] >= 5.023001
+    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC,DYNFILE\\) # $] >= 5.015 && thr && $] < 5.023001
     PROTOTYPE = ""
     COMP_STASH = $ADDR\\t"main"
     START = $ADDR ===> \\d+
     ROOT = $ADDR
     GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
-    FILE = ".*\\b(?i:peek\\.t)"
     DEPTH = 0(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
-    FLAGS = 0x490				# $] < 5.015 || !thr
-    FLAGS = 0x1490				# $] >= 5.015 && thr
+    FLAGS = 0x490				# $] < 5.015 || !thr || $] >= 5.023001
+    FLAGS = 0x1490				# $] >= 5.015 && thr && $] < 5.023001
     OUTSIDE_SEQ = \\d+
     PADLIST = $ADDR
     PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
@@ -324,14 +323,13 @@ do_test('reference to named subroutine without prototype',
   RV = $ADDR
   SV = PVCV\\($ADDR\\) at $ADDR
     REFCNT = (3|4)
-    FLAGS = \\((?:HASEVAL(?:,NAMED)?)?\\)	# $] < 5.015 || !thr
-    FLAGS = \\(DYNFILE(?:,HASEVAL(?:,NAMED)?)?\\) # $] >= 5.015 && thr
+    FLAGS = \\((?:HASEVAL(?:,NAMED)?)?\\)	# $] < 5.015 || !thr || $] >= 5.023001
+    FLAGS = \\(DYNFILE(?:,HASEVAL(?:,NAMED)?)?\\) # $] >= 5.015 && $] < 5.023001 && thr
     COMP_STASH = $ADDR\\t"main"
     START = $ADDR ===> \\d+
     ROOT = $ADDR
     NAME = "do_test"				# $] >=5.021004
     GVGV::GV = $ADDR\\t"main" :: "do_test"	# $] < 5.021004
-    FILE = ".*\\b(?i:peek\\.t)"
     DEPTH = 1(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
@@ -664,8 +662,8 @@ do_test('constant subroutine',
   RV = $ADDR
   SV = PVCV\\($ADDR\\) at $ADDR
     REFCNT = (2)
-    FLAGS = \\(POK,pPOK,CONST,ISXSUB\\)		# $] < 5.015
-    FLAGS = \\(POK,pPOK,CONST,DYNFILE,ISXSUB\\)	# $] >= 5.015
+    FLAGS = \\(POK,pPOK,CONST,ISXSUB\\)		# $] < 5.015 || $] >= 5.023001
+    FLAGS = \\(POK,pPOK,CONST,DYNFILE,ISXSUB\\)	# $] >= 5.015 && $] < 5.023001
     PROTOTYPE = ""
     COMP_STASH = 0x0				# $] < 5.021004
     COMP_STASH = $ADDR	"main"			# $] >=5.021004
@@ -680,13 +678,12 @@ do_test('constant subroutine',
       LEN = \\d+
       COW_REFCNT = 0
     GVGV::GV = $ADDR\\t"main" :: "const"
-    FILE = ".*\\b(?i:peek\\.t)"
     DEPTH = 0(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
     FLAGS = 0xc00				# $] < 5.013
-    FLAGS = 0xc					# $] >= 5.013 && $] < 5.015
-    FLAGS = 0x100c				# $] >= 5.015
+    FLAGS = 0xc					# ($] >= 5.013 && $] < 5.015) || $] >= 5.023001
+    FLAGS = 0x100c				# $] >= 5.015 && $] < 5.023001
     OUTSIDE_SEQ = 0
     PADLIST = 0x0				# $] < 5.021006
     HSCXT = $ADDR				# $] >= 5.021006
@@ -734,19 +731,18 @@ do_test('FORMAT',
   RV = $ADDR
   SV = PVFM\\($ADDR\\) at $ADDR
     REFCNT = 2
-    FLAGS = \\(\\)				# $] < 5.015 || !thr
-    FLAGS = \\(DYNFILE\\)			# $] >= 5.015 && thr
+    FLAGS = \\(\\)				# $] < 5.015 || !thr || $] >= 5.023001
+    FLAGS = \\(DYNFILE\\)			# $] >= 5.015 && thr && $] < 5.023001
 (?:    PV = 0
 )?    COMP_STASH = 0x0
     START = $ADDR ===> \\d+
     ROOT = $ADDR
-    GVGV::GV = $ADDR\\t"main" :: "PIE"
-    FILE = ".*\\b(?i:peek\\.t)"(?:
+    GVGV::GV = $ADDR\\t"main" :: "PIE"(?:
     DEPTH = 0)?(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
-    FLAGS = 0x0					# $] < 5.015 || !thr
-    FLAGS = 0x1000				# $] >= 5.015 && thr
+    FLAGS = 0x0					# $] < 5.015 || !thr || $] >= 5.023001
+    FLAGS = 0x1000				# $] >= 5.015 && thr && $] < 5.023001
     OUTSIDE_SEQ = \\d+
     LINES = 0					# $] < 5.017_003
     PADLIST = $ADDR
diff --git a/gv.c b/gv.c
index c9058a7..8ec6401 100644
--- a/gv.c
+++ b/gv.c
@@ -612,7 +612,7 @@ S_maybe_add_coresub(pTHX_ HV * const stash, GV *gv,
     /* XSUBs can't be perl lang/perl5db.pl debugged
     if (PERLDB_LINE || PERLDB_SAVESRC)
         (void)gv_fetchfile(file); */
-    CvFILE(cv) = (char *)file;
+/*    CvFILE(cv) = (char *)file; */
     /* XXX This is inefficient, as doing things this order causes
            a prototype check in newATTRSUB.  But we have to do
            it this order as we need an op number before calling
diff --git a/lib/B/Deparse.pm b/lib/B/Deparse.pm
index d4c6f60..fbe4ab8 100644
--- a/lib/B/Deparse.pm
+++ b/lib/B/Deparse.pm
@@ -46,7 +46,7 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
         MDEREF_SHIFT
     );
 
-$VERSION = '1.35';
+$VERSION = '1.36';
 use strict;
 use vars qw/$AUTOLOAD/;
 use warnings ();
@@ -477,7 +477,9 @@ sub null {
 sub todo {
     my $self = shift;
     my($cv, $is_form, $name) = @_;
-    my $cvfile = $cv->FILE//'';
+    #if this a CVf_NAMED CV, GV is being reified on the next line
+    #and GV's GP's FILE is Deparse.pm :-(
+    my $cvfile = $cv->GV->FILE//'';
     return unless ($cvfile eq $0 || exists $self->{files}{$cvfile});
     my $seq;
     if ($cv->OUTSIDE_SEQ) {
diff --git a/op.c b/op.c
index f67b631..76bb8e0 100644
--- a/op.c
+++ b/op.c
@@ -8187,7 +8187,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
 	}
 	else {
 	    cv = MUTABLE_CV(newSV_type(SVt_PVCV));
-	    CvFILE_set_from_cop(cv, PL_curcop);
+	    /* CvFILE_set_from_cop(cv, PL_curcop); */
 	    CvSTASH_set(cv, PL_curstash);
 	    *spot = cv;
 	}
@@ -8240,9 +8240,11 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
 	    CvFLAGS(compcv) &= ~(CVf_SLABBED|CVf_WEAKOUTSIDE);
 	    CvFLAGS(compcv) |= other_flags;
 
+/*
 	    if (CvFILE(cv) && CvDYNFILE(cv)) {
 		Safefree(CvFILE(cv));
 	    }
+*/
 
 	    /* inner references to compcv must be fixed up ... */
 	    pad_fixup_inner_anons(CvPADLIST(cv), compcv, cv);
@@ -8277,7 +8279,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     }
     if (const_sv) goto clone;
 
-    CvFILE_set_from_cop(cv, PL_curcop);
+    /*CvFILE_set_from_cop(cv, PL_curcop);*/
     CvSTASH_set(cv, PL_curstash);
 
     if (ps) {
@@ -8695,10 +8697,12 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
 	    CvFLAGS(PL_compcv) &= ~(CVf_SLABBED|CVf_WEAKOUTSIDE);
 	    CvFLAGS(PL_compcv) |= other_flags;
 
+/*  
 	    if (CvFILE(cv) && CvDYNFILE(cv)) {
 		Safefree(CvFILE(cv));
     }
 	    CvFILE_set_from_cop(cv, PL_curcop);
+*/
 	    CvSTASH_set(cv, PL_curstash);
 
 	    /* inner references to PL_compcv must be fixed up ... */
@@ -8745,7 +8749,9 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
 					    :  (SSize_t)namlen,
 					 hash));
 	}
+/*
 	CvFILE_set_from_cop(cv, PL_curcop);
+*/
 	CvSTASH_set(cv, PL_curstash);
     }
 
@@ -9119,22 +9125,23 @@ Perl_newXS_len_flags(pTHX_ const char *name, STRLEN len,
         }
 
         CvGV_set(cv, gv);
-        if(filename) {
-            /* XSUBs can't be perl lang/perl5db.pl debugged
-            if (PERLDB_LINE || PERLDB_SAVESRC)
-                (void)gv_fetchfile(filename); */
-            assert(!CvDYNFILE(cv)); /* cv_undef should have turned it off */
-            if (flags & XS_DYNAMIC_FILENAME) {
-                CvDYNFILE_on(cv);
-                CvFILE(cv) = savepv(filename);
-            } else {
-            /* NOTE: not copied, as it is expected to be an external constant string */
-                CvFILE(cv) = (char *)filename;
-            }
-        } else {
-            assert((flags & XS_DYNAMIC_FILENAME) == 0 && PL_xsubfilename);
-            CvFILE(cv) = (char*)PL_xsubfilename;
-        }
+        //if(filename) {
+        //    /* XSUBs can't be perl lang/perl5db.pl debugged
+        //    if (PERLDB_LINE || PERLDB_SAVESRC)
+        //        (void)gv_fetchfile(filename); */
+        //    assert(!CvDYNFILE(cv)); /* cv_undef should have turned it off */
+        //    if (flags & XS_DYNAMIC_FILENAME) {
+        //        CvDYNFILE_on(cv);
+        //        CvFILE(cv) = savepv(filename);
+        //    } else {
+        //    /* NOTE: not copied, as it is expected to be an external constant string */
+        //        CvFILE(cv) = (char *)filename;
+        //    }
+        //} else {
+        //    assert((flags & XS_DYNAMIC_FILENAME) == 0 && PL_xsubfilename);
+        //    CvFILE(cv) = (char*)PL_xsubfilename;
+        //}
+
         CvISXSUB_on(cv);
         CvXSUB(cv) = subaddr;
 #ifndef PERL_IMPLICIT_CONTEXT
@@ -9172,7 +9179,9 @@ Perl_newSTUB(pTHX_ GV *gv, bool fake)
     }
     else cvgv = gv;
     CvGV_set(cv, cvgv);
+/*
     CvFILE_set_from_cop(cv, PL_curcop);
+*/
     CvSTASH_set(cv, PL_curstash);
     GvMULTI_on(gv);
     return cv;
@@ -9215,7 +9224,9 @@ Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
     cv = PL_compcv;
     GvFORM(gv) = (CV *)SvREFCNT_inc_simple_NN(cv);
     CvGV_set(cv, gv);
+/*
     CvFILE_set_from_cop(cv, PL_curcop);
+*/
 
 
     pad_tidy(padtidy_FORMAT);
diff --git a/pad.c b/pad.c
index f5ce5f5..4e54239 100644
--- a/pad.c
+++ b/pad.c
@@ -316,12 +316,14 @@ Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags)
 	    PTR2UV(cv), PTR2UV(PL_comppad))
     );
 
+/*
     if (CvFILE(&cvbody)) {
 	char * file = CvFILE(&cvbody);
 	CvFILE(&cvbody) = NULL;
 	if(CvDYNFILE(&cvbody))
 	    Safefree(file);
     }
+*/
 
     /* CvSLABBED_off(&cvbody); *//* turned off below */
     /* release the sub's body */
@@ -2270,8 +2272,11 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside, HV *cloned)
 				    |CVf_SLABBED);
     CvCLONED_on(cv);
 
+/*
     CvFILE(cv)		= CvDYNFILE(proto) ? savepv(CvFILE(proto))
 					   : CvFILE(proto);
+*/
+
     if (CvNAMED(proto))
 	 CvNAME_HEK_set(cv, share_hek_hek(CvNAME_HEK(proto)));
     else CvGV_set(cv,CvGV(proto));
diff --git a/perl.c b/perl.c
index cbb66e0..0dd5afe 100644
--- a/perl.c
+++ b/perl.c
@@ -2144,6 +2144,22 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
     assert (!TAINT_get);
     init_perllib();
 
+    CopFILE_free(PL_curcop); /* this should be asserted NULL here and the free removed */
+    CopFILE_set(PL_curcop, "perl.c"); /* register perma-XSUBs's GVs as being from core, not -e or initial script */
+
+    boot_core_PerlIO();
+    boot_core_UNIVERSAL();
+    boot_core_mro();
+    newXS("Internals::V", S_Internals_V, __FILE__);
+
+    if (xsinit)
+	(*xsinit)(aTHX);	/* in case linked C routines want magical variables */
+#ifndef PERL_MICRO
+#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(SYMBIAN)
+    init_os_extras();
+#endif
+#endif
+
     {
 	bool suidscript = FALSE;
 
@@ -2193,19 +2209,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
 
     PL_isarev = newHV();
 
-    boot_core_PerlIO();
-    boot_core_UNIVERSAL();
-    boot_core_mro();
-    newXS("Internals::V", S_Internals_V, __FILE__);
-
-    if (xsinit)
-	(*xsinit)(aTHX);	/* in case linked C routines want magical variables */
-#ifndef PERL_MICRO
-#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(SYMBIAN)
-    init_os_extras();
-#endif
-#endif
-
 #ifdef USE_SOCKS
 #   ifdef HAS_SOCKS5_INIT
     socks5_init(argv[0]);
diff --git a/sv.c b/sv.c
index b4a36e5..d2a641f 100644
--- a/sv.c
+++ b/sv.c
@@ -13607,7 +13607,9 @@ S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
 			sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
 		}
 		assert(!CvSLABBED(dstr));
+/*
 		if (CvDYNFILE(dstr)) CvFILE(dstr) = SAVEPV(CvFILE(dstr));
+*/
 		if (CvNAMED(dstr))
 		    SvANY((CV *)dstr)->xcv_gv_u.xcv_hek =
 			hek_dup(CvNAME_HEK((CV *)sstr), param);
diff --git a/sv.h b/sv.h
index 61d5275..d8ed612 100644
--- a/sv.h
+++ b/sv.h
@@ -644,7 +644,6 @@ typedef U32 cv_flags_t;
 	GV *	xcv_gv;							\
 	HEK *	xcv_hek;						\
     }		xcv_gv_u;						\
-    char *	xcv_file;							\
     union {									\
 	PADLIST *	xcv_padlist;						\
 	void *		xcv_hscxt;						\
diff --git a/t/op/stash.t b/t/op/stash.t
index 151b729..d0e383a 100644
--- a/t/op/stash.t
+++ b/t/op/stash.t
@@ -7,7 +7,7 @@ BEGIN {
 
 BEGIN { require "./test.pl"; }
 
-plan( tests => 51 );
+plan( tests => 49 );
 
 # Used to segfault (bug #15479)
 fresh_perl_like(
@@ -215,10 +215,6 @@ SKIP: {
 	my $br = B::svref_2object($r);
 	is ($br->STASH->NAME, 'bloop',
 	    'stub records the package it was compiled in');
-	# Arguably this shouldn't quite be here, but it's easy to add it
-	# here, and tricky to figure out a different good place for it.
-	like ($br->FILE, qr/stash/i,
-	      'stub records the file it was compiled in');
 
 	# We need to take this reference "late", after the subroutine is
 	# defined.
@@ -227,8 +223,6 @@ SKIP: {
 
 	is ($br->STASH->NAME, 'main',
 	    'definition overrides the package it was compiled in');
-	like ($br->FILE, qr/eval/,
-	      'definition overrides the file it was compiled in');
     }
 }
 
diff --git a/t/uni/stash.t b/t/uni/stash.t
index 31d6c9d..680d900 100644
--- a/t/uni/stash.t
+++ b/t/uni/stash.t
@@ -13,7 +13,7 @@ BEGIN {
 use utf8;
 use open qw( :utf8 :std );
 
-plan( tests => 49 );
+plan( tests => 48 );
 
 #These come from op/my_stash.t
 {
@@ -208,8 +208,6 @@ plan( tests => 49 );
     
             is ($br->STASH->NAME, 'main',
                 'definition overrides the package it was compiled in');
-            like ($br->FILE, qr/eval/,
-                'definition overrides the file it was compiled in');
         }
     }
     
diff --git a/universal.c b/universal.c
index 9b34df9..2050997 100644
--- a/universal.c
+++ b/universal.c
@@ -1110,11 +1110,13 @@ Perl_boot_core_UNIVERSAL(pTHX)
     {
 	CV * const cv =
 	    newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL);
+/*
 	char ** cvfile = &CvFILE(cv);
 	char * oldfile = *cvfile;
 	CvDYNFILE_off(cv);
 	*cvfile = (char *)file;
 	Safefree(oldfile);
+*/
     }
 }
 
-- 
1.7.9.msysgit.0


p5pRT avatar Jul 07 '15 07:07 p5pRT

From @rurban

On 07/07/2015 09​:08 AM, bulk88 via RT wrote​:

Since noone has had any comments, here is a concept patch to remove CvFILE as suggested by http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html This patch doesn't address CopFILE on threaded and its bloat.

As Sarathy already mentioned I need $cv->FILE in B​::C to check if the package is in the same file as main​:: or our source, mainly to support modulinos. If it has a CvGV then it is easy to fix.

Sarathy was wrong with the dynaloader bit​: I use now $gv->FILE, not the CV methods anymore.

I agree with the bloat, and CvFILE causes many more headaches.

The main problem I see is with lexical subs and the unNAMED subs. There we need the CvFILE.

Test Summary Report ------------------- ../lib/B/Deparse.t (Wstat​: 0 Tests​: 245 Failed​: 3) Failed tests​: 226, 230-231 Files=2390, Tests=712425, 1394 wallclock secs (67.19 usr + 3.88 sys = 71.06 CPU ) Result​: FAIL b88-dmake​: Error code 131, while making 'test'

Deparse failures.

ok 224 - no extra output when deparsing foo() ok 225 - sub calls compiled before importation of prototype subs # Failed test 226 - [perl \#121050] prototypes with whitespace at ../lib/B/Depar se.t line 345 # got "&_121050(\\$a, \\$b);\n() = &_121050empty() + 1;\n" # expected "sub _121050 (\\$ \\$) {\n \n}\n_121050 $a, $b;\nsub _121050empty ( ) {\n \n}\n() = _121050empty + 1;\n" not ok 226 - [perl \#121050] prototypes with whitespace ok 227 - CORE​::no after my sub no ok 228 - CORE​::use after my sub use

Zefram on IRC said those 2 above are functionally identical.

ok 228 - CORE​::use after my sub use ok 229 - CORE​::__DATA__ after my sub __DATA__ # Failed test 230 - sub declarations at ../lib/B/Deparse.t line 384 # got '-e syntax OK # ' # expected /(?^​:sub foo\s*\{\s+\})/ not ok 230 - sub declarations # Failed test 231 - predeclared prototyped subs at ../lib/B/Deparse.t line 385 # got '' # expected /(?^​:sub f\s*\(\$\)\s*\{\s*\})/ not ok 231 - predeclared prototyped subs ok 232 - prototyped stub with weak reference to the stash entry ok 233 - constant perl sub declaration

The failures are all related to the todo sub in Deparse.pm. Sub todo is called like this, but I dont understand its purpise enough to say what it does.

    B&#8203;::Deparse&#8203;::todo\(B&#8203;::Deparse=HASH\(0xad8ac4\)\, B&#8203;::CV=SCALAR\(0xc06d34\)\, 0\) c

alled at ../lib/B/Deparse.pm line 775 B​::Deparse​::stash_subs(B​::Deparse=HASH(0xad8ac4), "utf8​::", HASH(0xceeb8 c)) called at ../lib/B/Deparse.pm line 782 B​::Deparse​::stash_subs(B​::Deparse=HASH(0xad8ac4)) called at ../lib/B/Dep arse.pm line 932 B​::Deparse​::__ANON__() called at (eval 2) line 31 O​::CHECK() called at -e line 0 eval {...} called at -e line 0

The failures (specifically I am talking about test 226 " [perl \#121050] prototypes with whitespace") seem to be caused by CVs without GVs. Commit http​://perl5.git.perl.org/perl.git/commitdiff/b290562ef436d5316a2f75513def7f4f18c4ef34 "Allow CVs to point to HEKs rather than GVs" by Father C created the scenario where some CVs dont have GVs anymore. Test 226 is such a CV. In test 226 when $cv->GV executes in B, it vivifys the GV, and the GV gets the FILE and LINE from inside sub todo from Deparse.pm. I think that B​::CV​::GV should not be vivifying things. A getter should not be changing state. Before ->GV is called, CVf_NAMED is on, after ->GV() it is off. Since the GV doesn't exist for test 226, I got the idea, if the CV is a CVf_NAMED CV, use the FILE from the GV that holds the stash HV, it should usually be correct (unless you are create subs from a different .pm than the formal .pm for that package). I did a svref_2object(\*{$cv->STASH->NAME.'​::'}->FILE but test 226 still failed since FILE was empty string and not "-e" AKA $O.

-------------------------------------------------------------------------------------- C​:\perl521\srcnewb4opt\t>perl -I../lib -MB -E" say B​::svref_2object(\*{'main'})-

FILE" -e

C​:\perl521\srcnewb4opt\t>perl -I../lib -MB -E" say B​::svref_2object(\*{'main​::'} )->FILE"

--------------------------------------------------------------------------------------

But notice main​:: has no FILE, that is because PL_curcop->cop_file/cop_filegv is NULL at the time main is created in S_init_main_stash. I guess S_parse_body could be modified to change the creation location file of main to curcop, but I stopped at this point before investing more time.

You get the main->FILE via   $mainfile = $cop->file if $cop->stashpv eq 'main'; in the COP walker

Another conceptual flaw with CvFILE is, where is the line number where the CV was created? What about PP? What about XS (too late to change newXS?) Is it a waste to store line number? Is it a waste to store CvFILE? Like with GVs, if you will store the file, you have to store the line. CvFILE is almost useless as a debugging aid otherwise.

Should CVf_NAMED and related code be removed since it removes the GVs which store creation location?

Hmm

[Disclaimer​: The views expressed in this letter are my own, and do not represent those of my employer.] -- Reini

Working towards a true Modern Perl. Slim, functional, unbloated, compile-time optimizable

p5pRT avatar Jul 07 '15 09:07 p5pRT

The RT System itself - Status changed from 'new' to 'open'

p5pRT avatar Jul 07 '15 09:07 p5pRT

From @bulk88

On Tue Jul 07 00​:08​:49 2015, bulk88 wrote​:

Since noone has had any comments, here is a concept patch to remove CvFILE as suggested by http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html This patch doesn't address CopFILE on threaded and its bloat.

A much more rough patch I earlier worked on where instead of deleting CvFILE, CvFILE was extracted from the first op of the PP CV, which usually a nextstate op. This avoids the savepv() and additional alloc, since the storage in pp_nextstate is like a C literal string for XSUBs, it will be around until the sub is redefined and at that time a new CvFILE is put in. In one place in testing I found if Perl_pmruntime is the caller of Perl_newATTRSUB_x, OP * start is a pp_qr not a pp_nextstate, IDK enough about the optree to say if this is a bug.

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Jul 09 '15 05:07 p5pRT

From @bulk88

0001-dont-report-a-exception-with-uninitialized-s-message.patch
From c43b488191f961a0a77462f931b04e4915b215af Mon Sep 17 00:00:00 2001
From: Daniel Dragan <[email protected]>
Date: Tue, 7 Jul 2015 12:59:01 -0400
Subject: [PATCH] dont report a $@ exception with uninitialized $!'s message
 in IPC::Open3

Commit a24d8dfd08 "Make IPC::Open3 work without fork()" from 5.003 created
an eval block, and if that eval block threw an exception, instead of
propagating $@, the code propagated $!, even though no system call was done
and $! is effectivly unintialized data. In one case for me, a taint
exception inside system was turned into open3() throwing an exception
about "Inappropriate I/O control operation" or "Bad file descriptor", which
had nothing to do with the real fault which was a Perl C level croak with
the message "Insecure $ENV{PATH} while running with -T switch at ..."
which was called as Perl_pp_system->Perl_taint_env->Perl_taint_proper->
Perl_croak->Perl_vcroak. This patch does not try to fix the ambiguity of
the error messages between the !DO_SPAWN and IO::Pipe
branches/implementations of _open3.
---
 ext/IPC-Open3/lib/IPC/Open3.pm |    8 +++++-
 ext/IPC-Open3/t/IPC-Open3.t    |   42 +++++++++++++++++++++++++++++++++++++++-
 pod/perldelta.pod              |    7 +++++-
 3 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/ext/IPC-Open3/lib/IPC/Open3.pm b/ext/IPC-Open3/lib/IPC/Open3.pm
index 7c7e9b5..273f205 100644
--- a/ext/IPC-Open3/lib/IPC/Open3.pm
+++ b/ext/IPC-Open3/lib/IPC/Open3.pm
@@ -9,7 +9,7 @@ require Exporter;
 use Carp;
 use Symbol qw(gensym qualify);
 
-$VERSION	= '1.18';
+$VERSION	= '1.19';
 @ISA		= qw(Exporter);
 @EXPORT		= qw(open3);
 
@@ -412,7 +412,11 @@ sub spawn_with_handles {
 	} else {
 	    $pid = eval { system 1, @_ }; # 1 == P_NOWAIT
 	}
-	push @errs, "IO::Pipe: Can't spawn-NOWAIT: $!" if !$pid || $pid < 0;
+	if($@) {
+	    push @errs, "IO::Pipe: Can't spawn-NOWAIT: $@";
+	} elsif(!$pid || $pid < 0) {
+	    push @errs, "IO::Pipe: Can't spawn-NOWAIT: $!";
+	}
     }
 
     # Do this in reverse, so that STDERR is restored first:
diff --git a/ext/IPC-Open3/t/IPC-Open3.t b/ext/IPC-Open3/t/IPC-Open3.t
index fcaecef..25cfdfb 100644
--- a/ext/IPC-Open3/t/IPC-Open3.t
+++ b/ext/IPC-Open3/t/IPC-Open3.t
@@ -14,7 +14,7 @@ BEGIN {
 }
 
 use strict;
-use Test::More tests => 44;
+use Test::More tests => 45;
 
 use IO::Handle;
 use IPC::Open3;
@@ -165,6 +165,46 @@ $pid = eval { open3 'WRITE', '', 'ERROR', '/non/existent/program'; };
 like($@, qr/^open3: Modification of a read-only value attempted at /,
      'open3 faults read-only parameters correctly') or do {waitpid $pid, 0};
 
+package NoFetch;
+
+my $fetchcount = 1;
+
+sub TIESCALAR {
+  my $class = shift;
+  my $instance = shift || undef;
+  return bless \$instance => $class;
+}
+
+sub FETCH {
+    my $cmd; #dont let "@args = @DB::args;" in Carp::caller_info fire this die
+    #fetchcount may need to be increased to 2 if this code is being stepped with
+    #a perl debugger
+    if($fetchcount == 1 && (caller(1))[3] ne 'Carp::caller_info') {
+	#Carp croak reports the errors as being in IPC-Open3.t, so it is
+	#unacceptable for testing where the FETCH failure occured, we dont want
+	#it failing in a $foo = $_[0]; #later# system($foo), where the failure
+	#is supposed to be triggered in the inner most syscall, aka system()
+	my ($package, $filename, $line, $subroutine) = caller(2);
+
+	die("FETCH not allowed in ".((caller(1))[3])." in ".((caller(2))[3])."\n");
+    } else {
+	$fetchcount++;
+	return tie($cmd, 'NoFetch');
+    }
+}
+
+package main;
+
+{
+    my $cmd;
+    tie($cmd, 'NoFetch');
+
+    $pid = eval { open3 'WRITE', 'READ', 'ERROR', $cmd; };
+    like($@, qr/^(?:open3: IO::Pipe: Can't spawn-NOWAIT: FETCH not allowed in \(eval\) (?x:
+         )in IPC::Open3::spawn_with_handles|FETCH not allowed in \(eval\) in IPC::Open3::_open3)/,
+     'dieing inside Tied arg propagates correctly') or do {waitpid $pid, 0};
+}
+
 foreach my $handle (qw (DUMMY STDIN STDOUT STDERR)) {
     local $::{$handle};
     my $out = IO::Handle->new();
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index d985359..a1c6730 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -148,7 +148,12 @@ XXX
 
 =item *
 
-L<XXX> has been upgraded from version A.xx to B.yy.
+L<IPC::Open3> has been upgraded from version 1.18 to 1.19.
+
+If a Perl exception was thrown from inside this module, the exception
+C<IPC::Open3> threw to the callers of C<open3> would have an irrelavent
+message derived from C<$!> which was in an undefined state, instead of the
+C<$@> message which triggers the failure path inside C<open3>.
 
 =back
 
-- 
1.7.9.msysgit.0


p5pRT avatar Jul 09 '15 05:07 p5pRT

From @bulk88

On Tue Jul 07 00​:08​:49 2015, bulk88 wrote​:

Since noone has had any comments, here is a concept patch to remove CvFILE as suggested by http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html This patch doesn't address CopFILE on threaded and its bloat.

****WRONG PATCH ABOVE*************

A much more rough patch I earlier worked on where instead of deleting CvFILE, CvFILE was extracted from the first op of the PP CV, which usually a nextstate op. This avoids the savepv() and additional alloc, since the storage in pp_nextstate is like a C literal string for XSUBs, it will be around until the sub is redefined and at that time a new CvFILE is put in. In one place in testing I found if Perl_pmruntime is the caller of Perl_newATTRSUB_x, OP * start is a pp_qr not a pp_nextstate, IDK enough about the optree to say if this is a bug.

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Jul 09 '15 05:07 p5pRT

From @bulk88

0001-wip-CvFILE-mem-waste.patch
From 116483b264e69135efcd1a639655caca36d1e1db Mon Sep 17 00:00:00 2001
From: Daniel Dragan <[email protected]>
Date: Mon, 1 Jun 2015 15:35:49 -0400
Subject: [PATCH] wip CvFILE mem waste

---
 cv.h                    |    7 +------
 ext/Devel-Peek/t/Peek.t |   24 ++++++++++++------------
 op.c                    |   28 ++++++++++++++++++++++++----
 3 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/cv.h b/cv.h
index d4dfd2d..5ba8133 100644
--- a/cv.h
+++ b/cv.h
@@ -53,13 +53,8 @@ See L<perlguts/Autoloading with XSUBs>.
 #define CvGV_set(cv,gv)	Perl_cvgv_set(aTHX_ cv, gv)
 #define CvHASGV(cv)	cBOOL(SvANY(cv)->xcv_gv_u.xcv_gv)
 #define CvFILE(sv)	((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file
-#ifdef USE_ITHREADS
-#  define CvFILE_set_from_cop(sv, cop)	\
-    (CvFILE(sv) = savepv(CopFILE(cop)), CvDYNFILE_on(sv))
-#else
-#  define CvFILE_set_from_cop(sv, cop)	\
+#define CvFILE_set_from_cop(sv, cop)	\
     (CvFILE(sv) = CopFILE(cop), CvDYNFILE_off(sv))
-#endif
 #define CvFILEGV(sv)	(gv_fetchfile(CvFILE(sv)))
 #define CvDEPTH(sv)	(*S_CvDEPTHp((const CV *)sv))
 /* For use when you only have a XPVCV*, not a real CV*.
diff --git a/ext/Devel-Peek/t/Peek.t b/ext/Devel-Peek/t/Peek.t
index 56522af..e31d729 100644
--- a/ext/Devel-Peek/t/Peek.t
+++ b/ext/Devel-Peek/t/Peek.t
@@ -298,8 +298,8 @@ do_test('reference to anon sub with empty prototype',
   RV = $ADDR
   SV = PVCV\\($ADDR\\) at $ADDR
     REFCNT = 2
-    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC\\) # $] < 5.015 || !thr
-    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC,DYNFILE\\) # $] >= 5.015 && thr
+    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC\\) # $] < 5.015 || !thr || $] >= 5.022
+    FLAGS = \\($PADMY,POK,pPOK,ANON,WEAKOUTSIDE,CVGV_RC,DYNFILE\\) # $] >= 5.015 && thr && $] < 5.022
     PROTOTYPE = ""
     COMP_STASH = $ADDR\\t"main"
     START = $ADDR ===> \\d+
@@ -309,8 +309,8 @@ do_test('reference to anon sub with empty prototype',
     DEPTH = 0(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
-    FLAGS = 0x490				# $] < 5.015 || !thr
-    FLAGS = 0x1490				# $] >= 5.015 && thr
+    FLAGS = 0x490				# $] < 5.015 || !thr || $] >= 5.022
+    FLAGS = 0x1490				# $] >= 5.015 && thr && $] < 5.022
     OUTSIDE_SEQ = \\d+
     PADLIST = $ADDR
     PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
@@ -324,8 +324,8 @@ do_test('reference to named subroutine without prototype',
   RV = $ADDR
   SV = PVCV\\($ADDR\\) at $ADDR
     REFCNT = (3|4)
-    FLAGS = \\((?:HASEVAL(?:,NAMED)?)?\\)	# $] < 5.015 || !thr
-    FLAGS = \\(DYNFILE(?:,HASEVAL(?:,NAMED)?)?\\) # $] >= 5.015 && thr
+    FLAGS = \\((?:HASEVAL(?:,NAMED)?)?\\)	# $] < 5.015 || !thr || $] >= 5.022
+    FLAGS = \\(DYNFILE(?:,HASEVAL(?:,NAMED)?)?\\) # $] >= 5.015 && thr && $] < 5.022
     COMP_STASH = $ADDR\\t"main"
     START = $ADDR ===> \\d+
     ROOT = $ADDR
@@ -335,8 +335,8 @@ do_test('reference to named subroutine without prototype',
     DEPTH = 1(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
-    FLAGS = 0x(?:[c4]00)?0			# $] < 5.015 || !thr
-    FLAGS = 0x[cd145]000			# $] >= 5.015 && thr
+    FLAGS = 0x(?:[c4]00)?0			# $] < 5.015 || !thr || $] >= 5.022
+    FLAGS = 0x[cd145]000			# $] >= 5.015 && thr && $] < 5.022
     OUTSIDE_SEQ = \\d+
     PADLIST = $ADDR
     PADNAME = $ADDR\\($ADDR\\) PAD = $ADDR\\($ADDR\\)
@@ -734,8 +734,8 @@ do_test('FORMAT',
   RV = $ADDR
   SV = PVFM\\($ADDR\\) at $ADDR
     REFCNT = 2
-    FLAGS = \\(\\)				# $] < 5.015 || !thr
-    FLAGS = \\(DYNFILE\\)			# $] >= 5.015 && thr
+    FLAGS = \\(\\)				# $] < 5.015 || !thr || $] >= 5.022
+    FLAGS = \\(DYNFILE\\)			# $] >= 5.015 && thr && $] < 5.022
 (?:    PV = 0
 )?    COMP_STASH = 0x0
     START = $ADDR ===> \\d+
@@ -745,8 +745,8 @@ do_test('FORMAT',
     DEPTH = 0)?(?:
     MUTEXP = $ADDR
     OWNER = $ADDR)?
-    FLAGS = 0x0					# $] < 5.015 || !thr
-    FLAGS = 0x1000				# $] >= 5.015 && thr
+    FLAGS = 0x0					# $] < 5.015 || !thr || $] >= 5.022
+    FLAGS = 0x1000				# $] >= 5.015 && thr && $] < 5.022
     OUTSIDE_SEQ = \\d+
     LINES = 0					# $] < 5.017_003
     PADLIST = $ADDR
diff --git a/op.c b/op.c
index cab214a..a3d43c9 100644
--- a/op.c
+++ b/op.c
@@ -8690,10 +8690,10 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
 	    CvFLAGS(PL_compcv) &= ~(CVf_SLABBED|CVf_WEAKOUTSIDE);
 	    CvFLAGS(PL_compcv) |= other_flags;
 
-	    if (CvFILE(cv) && CvDYNFILE(cv)) {
+	    if (CvFILE(cv) && CvDYNFILE(cv))
 		Safefree(CvFILE(cv));
-    }
-	    CvFILE_set_from_cop(cv, PL_curcop);
+
+	    //CvFILE_set_from_cop(cv, PL_curcop);
 	    CvSTASH_set(cv, PL_curstash);
 
 	    /* inner references to PL_compcv must be fixed up ... */
@@ -8769,6 +8769,22 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
     slab = (OPSLAB *)CvSTART(cv);
 #endif
     CvSTART(cv) = start;
+    {
+        COP * startcop = (COP*) start;
+        //assert(startcop->op_type == OP_NEXTSTATE);
+	//if Perl_pmruntime is the caller of Perl_newATTRSUB_x, OP * start is a pp_qr not a pp_nextstate
+  //do {
+  //  # In pre-5.9.5 world we have to do dirty tricks.
+  //  # (we use 'our' rather than 'my' here, due to the rather complex and buggy
+  //  # behaviour of lexicals with qr// and (??{$lex}) )
+  //  our $trick1; # yes, cannot our and assign at the same time.
+  //  $trick1 = qr{ \( (?: (?> [^()]+ ) | (??{ $trick1 }) )* \) }x;
+  //  our $trick2 = qr{ (?> (?! \d) \w+ (?:$trick1)? ) (?:\s*\:\s*|\s+(?!\:)) }x;
+  //  qr{ \s* : \s* (?: $trick2 )* }x;
+  //};
+	if(startcop->op_type == OP_NEXTSTATE)
+	    CvFILE_set_from_cop(cv, startcop);
+    }
     CALL_PEEP(start);
     finalize_optree(CvROOT(cv));
     S_prune_chain_head(&CvSTART(cv));
@@ -9165,7 +9181,11 @@ Perl_newSTUB(pTHX_ GV *gv, bool fake)
     }
     else cvgv = gv;
     CvGV_set(cv, cvgv);
-    CvFILE_set_from_cop(cv, PL_curcop);
+//    CvFILE_set_from_cop(cv, PL_curcop); //DYNFILE here?
+
+    CvFILE(cv) = savepv(CopFILE(PL_curcop));
+    CvDYNFILE_on(cv);
+
     CvSTASH_set(cv, PL_curstash);
     GvMULTI_on(gv);
     return cv;
-- 
1.7.9.msysgit.0


p5pRT avatar Jul 09 '15 05:07 p5pRT

From @bulk88

Father C reported the same issue in https://rt.perl.org/Public/Bug/Display.html?id=117855

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Jul 19 '15 19:07 p5pRT

From @bulk88

On Wed Jul 08 22​:10​:42 2015, bulk88 wrote​:

On Tue Jul 07 00​:08​:49 2015, bulk88 wrote​:

Since noone has had any comments, here is a concept patch to remove CvFILE as suggested by http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html This patch doesn't address CopFILE on threaded and its bloat.

****WRONG PATCH ABOVE*************

A much more rough patch I earlier worked on where instead of deleting CvFILE, CvFILE was extracted from the first op of the PP CV, which usually a nextstate op.

I push a concept of the more permanent solution to CvFILE/GvFILE/CopFILE memory burn in http​://perl5.git.perl.org/perl.git/shortlog/refs/heads/smoke-me/bulk88/rt125296-wip-CopFILE-on-threads . Comments appreciated.

Currently I am calling the new data type a CHEK (compiling hek), as in "check". The other name I thought of was a FHEK (filename hash entry key), but it doesn't sound good to pronounce as in "FHEK off you motherFHEKers". PHEK (path hash entry key) isn't any better than FHEK to pronounce. PHKS (path hash key shared) also was rejected. SPHEK (shared path hash entry) sounds like "spec" and cause confusion in speech. I discovered term SHEK (shared HEK) is already kindda take by the HEKs stored in PL_strtab and would could very much confusion between a "Shared HEK" and a "shared HEK".

I am debating changing Perl_gv_fetchfile_hek to take a CHEK "char *" instead of a HEK * since Perl_gv_fetchfile_hek is so specialized and not public it might as well be more specialized and save the +/- asm ops backing up the char * to a HEK *, in the caller's CopFILEGV/CopFILESV/CopFILEAV macros.

I am also thinking of removing GvFILE_HEK would also be mathomed or outright removed or PERL_CORE-ed since it would return HEK * with the "_<" prefix. As a very inefficient back compat, it would be made non-lvalue and be

#define GvFILE_HEK(gv) SvSHARED_HEK_FROM_PV(SvPVX_const(sv_2mortal(newSVpvn_share(HEK_KEY(GvFILE_HEK2(gv)+2, HEK_LEN(GvFILE_HEK2(gv))-2, 0))

About PL_strtab, I think that making PL_strtab shared between ithreads would cause perf problems due to the high volume of lock activity but IDK how to prove that but clone/psuedofork would be slightly faster since all HEKs would just be refcnt++ed during the clone/psuedofork and not looked up in the ptr equivelence hash between the 2 interps. Also slightly more memory shared between the 2 interps (almost all hash key names would be shared).

Deleting %INC and reloading a module is so rare that I think its pointless to de-dup the CHEKs in a big central DB. One CHEK * set by S_open_script/pp_require spreads to all the COPs and CVs (and in future GVs) created by that src code file. In theory I think pp_entereval/S_incline need de-duping but "#line" is very rarely used. But with my patch the worst case scenario (1 mem alloc for file name per COP) with pp_entereval/S_incline is identical to the current situation.

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Feb 16 '16 21:02 p5pRT

From @iabyn

On Tue, Feb 16, 2016 at 01​:43​:07PM -0800, bulk88 via RT wrote​:

On Wed Jul 08 22​:10​:42 2015, bulk88 wrote​:

On Tue Jul 07 00​:08​:49 2015, bulk88 wrote​:

Since noone has had any comments, here is a concept patch to remove CvFILE as suggested by http​://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html This patch doesn't address CopFILE on threaded and its bloat.

****WRONG PATCH ABOVE*************

A much more rough patch I earlier worked on where instead of deleting CvFILE, CvFILE was extracted from the first op of the PP CV, which usually a nextstate op.

I push a concept of the more permanent solution to CvFILE/GvFILE/CopFILE memory burn in http​://perl5.git.perl.org/perl.git/shortlog/refs/heads/smoke-me/bulk88/rt125296-wip-CopFILE-on-threads . Comments appreciated.

I feel I would better be able to provide feedback if you were to give an outline description of what approach your WIP branch takes. I.e. I understand (roughly) that on ithreads, every COP gets a copy of the filename, while non-threaded share a GV; and (very vaguely) that in some way the GV has a name like '<_filename' which is needed by the debugger, and that threaded build recreate the GV in some way.

How does your solution work, and how (if at all) does it interact with or change other parts of perl?

-- This email is confidential, and now that you have read it you are legally obliged to shoot yourself. Or shoot a lawyer, if you prefer. If you have received this email in error, place it in its original wrapping and return for a full refund. By opening this email, you accept that Elvis lives.

p5pRT avatar Feb 17 '16 09:02 p5pRT

From @bulk88

On Wed Feb 17 01​:28​:34 2016, davem wrote​:

I feel I would better be able to provide feedback if you were to give an outline description of what approach your WIP branch takes. I.e. I understand (roughly) that on ithreads, every COP gets a copy of the filename, while non-threaded share a GV; and (very vaguely) that in some way the GV has a name like '<_filename' which is needed by the debugger, and that threaded build recreate the GV in some way.

http​://perl5.git.perl.org/perl.git/commitdiff/345d4464184a234301341596f73ee2d3550c9799#patch8

+/* A CHEK is a derived class of HEK, and struct shared_he is also a derived + * class of HEK. This makes a CHEK and struct shared_he be sibling classes today. + * Provisions exist that would allow struct shared_he to be a derived class of + * a CHEK once atomic refcount features are added to perl. + * Like a HEK *, a CHEK * is an immutable string. bulk88 decided that + * struct refcounted_he is too heavy weight and too specialized to be a + * inter-interp "string class" (HEs always have 2 strings conceptually, 1 + * string has obviously 1 string). + * + * CHEKs are currently only used to store filepaths that point to original PP + * or XS source code files of PP resourses. A CHEK is "stored in the optree". + * In reality it is shared between ithreads and psuedoforks and is allocated in + * process global memory (like optrees), not in per interp memory. In theory the + * CHEK can be used to store other strings between ithreads but that is not done + * ATM. Perhaps one day the Newx PV buffers in the PAD SVs of OP_CONST will be + * replaced by CHEKs and shared between ithreads, the SV*s and PADs cant be the + * same obviously between ithreads. + */

How does your solution work, and how (if at all) does it interact with or change other parts of perl?

There are no changes to public API except removal of GvFILE_HEK macro. HEKs are not public API, and have never been mentioned in perlguts. Therefore CHEKs are not public API. I did not touch any of the structs of unthreaded perl on purpose. Perhaps one day the threaded CHEK system will be used on unthreaded perl, without any lock acquire/release cycles done on the refcount of the CHEK, and the CHEK being allocated in per interp memory with unthreaded perl obviously.

PP __FILE__, CopFILE, CvFILE on const subs, GvFILE on GP *s, and PP caller all use CHEK *s now in threaded perl. In a perl proc memory dump, you wont find a "_<"-less path string in the process that is identical to a "_<" prefixed path string. I caught all of them and converted them to CHEKs.

CHEKs DO NOT live in PL_strtab due my fears over lock contention between different ithreads. I'd have to lock all operations with the PL_strtab hash or have many fine scope lockable HvARRAY elements and then a master https://msdn.microsoft.com/en-us/library/windows/desktop/aa904937%28v=vs.85%29.aspx (and port that MS code to unix) lock to control hash splitting. Some OSes, especially unixy ones do all locks with kernel mode transitions, user mode locks using atomic CPU features are rare or unheard of unlike MS land. There is no de-duping of CHEKs from a PV arg and LEN arg like with SHEKs.

http​://perl5.git.perl.org/perl.git/shortlog/refs/heads/smoke-me/bulk88/rt125296-wip-COPFILE-threads branch is now almost, or is feature complete (last issue is static or static const HEKs and CHEKs for B​::CC style compiled code I need to bring up in a separate P5P ML thread and that involves discussion P5P's hash seed design and I dont think CHEKs or seed changes will get in for 5.24 since there is a code freeze for user visible (but CHEKs aren't visible, maybe there is hope), but seed changes will have drama). The branch is missing all abstraction macros, and proper names for the APIs and macros. My CS names are poor everywhere so I dont want to name things just for it to be suggested to something else. When I cant think of var names, I start naming macros and vars after my cats. ppl feel free to suggest API names and macro names. Also should the code be "#ifdef USE_ITHREADS" or a different name all together, so you can use it on threaded and unthreaded as a build option if you choose.

I still dont know whether to call my API a CHEK, FHEK, PHEK, PHKS, or SPHEK.

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Feb 26 '16 12:02 p5pRT

From @bulk88

On Fri Feb 26 04​:01​:10 2016, bulk88 wrote​:

There are no changes to public API except removal of GvFILE_HEK macro. HEKs are not public API, and have never been mentioned in perlguts. Therefore CHEKs are not public API. I did not touch any of the structs of unthreaded perl on purpose. Perhaps one day the threaded CHEK system will be used on unthreaded perl, without any lock acquire/release cycles done on the refcount of the CHEK, and the CHEK being allocated in per interp memory with unthreaded perl obviously.

PP __FILE__, CopFILE, CvFILE on const subs, GvFILE on GP *s, and PP caller all use CHEK *s now in threaded perl. In a perl proc memory dump, you wont find a "_<"-less path string in the process that is identical to a "_<" prefixed path string. I caught all of them and converted them to CHEKs.

CHEKs DO NOT live in PL_strtab due my fears over lock contention between different ithreads. I'd have to lock all operations with the PL_strtab hash or have many fine scope lockable HvARRAY elements and then a master https://msdn.microsoft.com/en- us/library/windows/desktop/aa904937%28v=vs.85%29.aspx (and port that MS code to unix) lock to control hash splitting. Some OSes, especially unixy ones do all locks with kernel mode transitions, user mode locks using atomic CPU features are rare or unheard of unlike MS land. There is no de-duping of CHEKs from a PV arg and LEN arg like with SHEKs.

http​://perl5.git.perl.org/perl.git/shortlog/refs/heads/smoke- me/bulk88/rt125296-wip-COPFILE-threads branch is now almost, or is feature complete (last issue is static or static const HEKs and CHEKs for B​::CC style compiled code I need to bring up in a separate P5P ML thread and that involves discussion P5P's hash seed design and I dont think CHEKs or seed changes will get in for 5.24 since there is a code freeze for user visible (but CHEKs aren't visible, maybe there is hope), but seed changes will have drama). The branch is missing all abstraction macros, and proper names for the APIs and macros. My CS names are poor everywhere so I dont want to name things just for it to be suggested to something else. When I cant think of var names, I start naming macros and vars after my cats. ppl feel free to suggest API names and macro names. Also should the code be "#ifdef USE_ITHREADS" or a different name all together, so you can use it on threaded and unthreaded as a build option if you choose.

I still dont know whether to call my API a CHEK, FHEK, PHEK, PHKS, or SPHEK.

test prog​: perl -MTest​::Harness -MTest​::More -e"sleep 1000"

summary​: 8-12 ms of CPU are saved in PP compile time and 280 KB of heap memory

raw data​:

after (head of my branch) 5216 KB Private Bytes (heap-ish memory on Win32)

C​:\p523\src>timeit -f t.dat perl -MTest​::Harness -MTest​::More -e"0"

Version Number​: Windows NT 6.1 (Build 7601) Exit Time​: 11​:31 am, Friday, February 26 2016 Elapsed Time​: 0​:00​:00.189 Process Time​: 0​:00​:00.187 System Calls​: 4096 Context Switches​: 994 Page Faults​: 2245 Bytes Read​: 758340 Bytes Written​: 484 Bytes Other​: 9440

C​:\p523\src>timeit -f t.dat perl -MTest​::Harness -MTest​::More -e"0"

Version Number​: Windows NT 6.1 (Build 7601) Exit Time​: 11​:31 am, Friday, February 26 2016 Elapsed Time​: 0​:00​:00.187 Process Time​: 0​:00​:00.156 System Calls​: 4419 Context Switches​: 1045 Page Faults​: 2505 Bytes Read​: 758032 Bytes Written​: 176 Bytes Other​: 9584

C​:\p523\src>timeit -f t.dat perl -MTest​::Harness -MTest​::More -e"0"

Version Number​: Windows NT 6.1 (Build 7601) Exit Time​: 11​:31 am, Friday, February 26 2016 Elapsed Time​: 0​:00​:00.185 Process Time​: 0​:00​:00.187 System Calls​: 3549 Context Switches​: 999 Page Faults​: 2267 Bytes Read​: 758032 Bytes Written​: 176 Bytes Other​: 9512

C​:\p523\src>

b4 (last blead commit) 5496 KB Private Bytes (heap-ish memory on Win32)

C​:\p523\src>timeit -f t.dat perl -MTest​::Harness -MTest​::More -e"0"

Version Number​: Windows NT 6.1 (Build 7601) Exit Time​: 10​:58 am, Friday, February 26 2016 Elapsed Time​: 0​:00​:00.198 Process Time​: 0​:00​:00.202 System Calls​: 5571 Context Switches​: 1114 Page Faults​: 3379 Bytes Read​: 761106 Bytes Written​: 264 Bytes Other​: 9512

C​:\p523\src>timeit -f t.dat perl -MTest​::Harness -MTest​::More -e"0"

Version Number​: Windows NT 6.1 (Build 7601) Exit Time​: 10​:58 am, Friday, February 26 2016 Elapsed Time​: 0​:00​:00.197 Process Time​: 0​:00​:00.187 System Calls​: 5328 Context Switches​: 964 Page Faults​: 2641 Bytes Read​: 758512 Bytes Written​: 132 Bytes Other​: 9604

C​:\p523\src>timeit -f t.dat perl -MTest​::Harness -MTest​::More -e"0"

Version Number​: Windows NT 6.1 (Build 7601) Exit Time​: 10​:58 am, Friday, February 26 2016 Elapsed Time​: 0​:00​:00.190 Process Time​: 0​:00​:00.187 System Calls​: 3769 Context Switches​: 926 Page Faults​: 2524 Bytes Read​: 758704 Bytes Written​: 344 Bytes Other​: 9512

C​:\p523\src>

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Feb 26 '16 16:02 p5pRT

From @bulk88

I am still waiting for feedback, or everyone agree with the design so they are staying quiet?

Unthreaded perl, which my branch doesn't touch the bahavior of, also has a duplicate .pm paths in memory problem, but not as big as threaded. But it is big enough that I think the CHEK API needs to also be on unthreaded. I've attached a fitlered strings dump of an unthreaded perl process "perl -MTest​::Harness -MTest​::More -e"sleep 1000"". I suspect __FILE__ and CvFILE are the sources of the file paths.

Fixing __FILE__ to COW means implementing the "ptr & ~0x3" thing on unthreaded to strip the _< from the CHEK COW SV, there is no way around that because of CopFILE's design on unthreaded, even if the COP still stores a GV * instead of a CHEK * on unthreaded in the potential future design, "ptr & ~0x3" thing must be implemented.

# define CopFILE(c) (CopFILEGV(c) \   ? GvNAME(CopFILEGV(c))+2 : NULL)

CvFILE is the "each const sub use CvDYNFILE/unique Newx path" problem. Storing a CHEK * or a HEK * in CvFILE instead of Newx * is the only way to fix that.

So it really seems like the CHEK API needs to be implemented on unthreaded, and toss larry's "GV * cop_filegv;" member forever from 5.0 alpha 2 at the expensive of making the perl debugger every slightly slower than before (or downgrade the "speed" of the unthreaded perl debugger to the threaded perl debugger? does speed even matter for the perl debugger since it waits for human responses most of the time?).

Perl 4's COP struct was

struct cmd {   CMD *c_next; /* the next command at this level */   ARG *c_expr; /* conditional expression */   CMD *c_head; /* head of this command list */   STR *c_short; /* string to match as shortcut */   STAB *c_stab; /* a symbol table entry, mostly for fp */   SPAT *c_spat; /* pattern used by optimization */   char *c_label; /* label for this construct */   union ucmd {   struct acmd acmd; /* normal command */   struct ccmd ccmd; /* compound command */   struct scmd scmd; /* switch command */   } ucmd;   short c_slen; /* len of c_short, if not null */   VOLATILE short c_flags; /* optimization flags--see above */   HASH *c_stash; /* package line was compiled in */   STAB *c_filestab; /* file the following line # is from */   line_t c_line; /* line # of this command */   char c_type; /* what this command does */ };

I believe a STAB is now called a GV and STR is now a SV.

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Mar 02 '16 21:03 p5pRT

From @bulk88

C​:/p523/src/lib/TAP/Parser/Aggregator.pm C​:/p523/src/lib/TAP/Parser/Aggregator.pm _<C​:/p523/src/lib/strict.pm C​:/p523/src/lib/Test/Harness.pm _<C​:/p523/src/lib/Test/Builder/Module.pm _<C​:/p523/src/lib/warnings/register.pm C​:/p523/src/lib/warnings/register.pm _<C​:/p523/src/lib/TAP/Parser/Aggregator.pm _<C​:/p523/src/lib/File/Spec/Win32.pm OSIX​::WEXITSTATUS not implemented on this architecture at C​:/p523/src/lib/TAP/Parser/Iterator/Process.pm line 84. C​:/p523/src/lib/strict.pm C​:/p523/src/lib/Test/Harness.pm C​:/p523/src/lib/Test/Harness.pm C​:/p523/src/lib/strict.pm C​:/p523/src/lib/strict.pm C​:/p523/src/lib/warnings.pm _<C​:/p523/src/lib/Test/Harness.pm C​:/p523/src/lib/Test/Builder.pm _<C​:/p523/src/lib/PerlIO.pm C​:/p523/src/lib/constant.pm C​:/p523/src/lib/constant.pm C​:/p523/src/lib/strict.pm C​:/p523/src/lib/strict.pm C​:/p523/src/lib/warnings.pm _<C​:/p523/src/lib/warnings.pm C​:/p523/src/lib/warnings.pm _<C​:/p523/src/lib/constant.pm C​:/p523/src/lib/constant.pm _<C​:/p523/src/lib/TAP/Harness.pm C​:/p523/src/lib/TAP/Harness.pm _<C​:/p523/src/lib/Exporter.pm C​:/p523/src/lib/Exporter.pm _<C​:/p523/src/lib/File/Spec.pm C​:/p523/src/lib/File/Spec.pm C​:/p523/src/lib/File/Spec/Win32.pm C​:/p523/src/lib/File/Spec/Unix.pm _<C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm _<C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/File/Path.pm _<C​:/p523/src/lib/File/Basename.pm C​:/p523/src/lib/File/Basename.pm _<C​:/p523/src/lib/IO/Handle.pm C​:/p523/src/lib/IO/Handle.pm _<C​:/p523/src/lib/Symbol.pm _<C​:/p523/src/lib/SelectSaver.pm C​:/p523/src/lib/SelectSaver.pm _<C​:/p523/src/lib/TAP/Base.pm C​:/p523/src/lib/TAP/Base.pm _<C​:/p523/src/lib/TAP/Object.pm C​:/p523/src/lib/TAP/Object.pm _<C​:/p523/src/lib/Time/HiRes.pm C​:/p523/src/lib/Time/HiRes.pm _<C​:/p523/src/lib/DynaLoader.pm C​:/p523/src/lib/DynaLoader.pm _<C​:/p523/src/lib/Config.pm C​:/p523/src/lib/TAP/Harness.pm C​:/p523/src/lib/TAP/Harness.pm C​:/p523/src/lib/Carp.pm C​:/p523/src/lib/Carp.pm C​:/p523/src/lib/Exporter.pm C​:/p523/src/lib/Exporter.pm warnings/register.pm C​:/p523/src/lib/warnings/register.pm C​:/p523/src/lib/warnings/register.pm _<C​:/p523/src/lib/Carp.pm C​:/p523/src/lib/Carp.pm C​:/p523/src/lib/File/Spec.pm C​:/p523/src/lib/File/Spec.pm C​:/p523/src/lib/vars.pm C​:/p523/src/lib/vars.pm C​:/p523/src/lib/Carp.pm C​:/p523/src/lib/Carp.pm Exporter/Heavy.pm _<C​:/p523/src/lib/vars.pm C​:/p523/src/lib/vars.pm C​:/p523/src/lib/File/Spec/Unix.pm C​:/p523/src/lib/File/Spec/Unix.pm File/Basename.pm C​:/p523/src/lib/File/Spec/Win32.pm C​:/p523/src/lib/File/Spec/Win32.pm File/Spec/Win32.pm File/Spec/Unix.pm Win32API/File.pm _<C​:/p523/src/lib/File/Spec/Unix.pm C​:/p523/src/lib/IO/Handle.pm C​:/p523/src/lib/IO/Handle.pm C​:/p523/src/lib/TAP/Object.pm C​:/p523/src/lib/TAP/Object.pm C​:/p523/src/lib/Symbol.pm C​:/p523/src/lib/Symbol.pm C​:/p523/src/lib/SelectSaver.pm C​:/p523/src/lib/SelectSaver.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/Symbol.pm _<C​:/p523/src/lib/IO.pm C​:/p523/src/lib/IO.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/Cwd.pm C​:/p523/src/lib/Cwd.pm _<C​:/p523/src/lib/Cwd.pm C​:/p523/src/lib/Cwd.pm C​:/p523/src/lib/IO.pm C​:/p523/src/lib/IO.pm _<C​:/p523/src/lib/Exporter/Heavy.pm C​:/p523/src/lib/TAP/Parser/SourceHandler/Perl.pm _<C​:/p523/src/lib/TAP/Parser/SourceHandler/Perl.pm _<C​:/p523/src/lib/TAP/Parser/IteratorFactory.pm C​:/p523/src/lib/TAP/Parser/IteratorFactory.pm _<C​:/p523/src/lib/TAP/Parser/Iterator/Process.pm C​:/p523/src/lib/TAP/Parser/Iterator/Process.pm C​:/p523/src/lib/File/Basename.pm C​:/p523/src/lib/File/Basename.pm C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/File/Path.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/TAP/Base.pm C​:/p523/src/lib/TAP/Base.pm _<C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/base.pm C​:/p523/src/lib/Exporter/Heavy.pm _<C​:/p523/src/lib/Benchmark.pm C​:/p523/src/lib/Benchmark.pm TAP/Parser/SourceHandler/Perl.pm _<C​:/p523/src/lib/Test/More.pm C​:/p523/src/lib/TAP/Parser/SourceHandler/Perl.pm C​:/p523/src/lib/TAP/Parser/SourceHandler/Perl.pm TAP/Parser/IteratorFactory.pm TAP/Parser/Iterator/Process.pm _<C​:/p523/src/lib/Tie/Hash.pm C​:/p523/src/lib/Tie/Hash.pm C​:/p523/src/lib/Text/ParseWords.pm C​:/p523/src/lib/Test/More.pm C​:/p523/src/lib/TAP/Parser/SourceHandler/Executable.pm C​:/p523/src/lib/TAP/Parser/SourceHandler/Executable.pm TAP/Parser/SourceHandler.pm _<C​:/p523/src/lib/Test/Builder.pm C​:/p523/src/lib/Time/HiRes.pm C​:/p523/src/lib/Time/HiRes.pm C​:/p523/src/lib/DynaLoader.pm C​:/p523/src/lib/DynaLoader.pm C​:/p523/src/lib/Config.pm C​:/p523/src/lib/Config.pm C​:/p523/src/lib/Config.pm ~ s{​::}{/}gr . '.pm' }; C​:/p523/src/lib/Exporter/Heavy.pm C​:/p523/src/lib/Exporter/Heavy.pm (?^​: at \S*Exporter\S*.pm line \d+.*\n) _<C​:/p523/src/lib/TAP/Parser/Source.pm C​:/p523/src/lib/TAP/Parser/Aggregator.pm C​:/p523/src/lib/TAP/Parser/Source.pm _<C​:/p523/src/lib/TAP/Parser/Iterator.pm _<C​:/p523/src/lib/Text/ParseWords.pm C​:/p523/src/lib/TAP/Parser/Iterator.pm TAP/Parser/SourceHandler/Executable.pm TAP/Parser/Aggregator.pm TAP/Parser/Source.pm CPAN/Meta/YAML.pm C​:/p523/src/lib/Benchmark.pm C​:/p523/src/lib/Benchmark.pm C​:/p523/src/lib/TAP/Parser/Source.pm C​:/p523/src/lib/TAP/Parser/Source.pm ourceHandler/Executable.pm C​:/p523/src/lib/TAP/Parser/SourceHandler.pm C​:/p523/src/lib/TAP/Parser/SourceHandler.pm C​:/p523/src/lib/TAP/Parser/IteratorFactory.pm providing more flexibility than the existing Test.pm. As such, the L<Test​::Legacy> tests written with Test.pm, the original testing emulates the Test.pm interface and does play well with others. C​:/p523/src/lib/TAP/Parser/IteratorFactory.pm C​:/p523/src/lib/TAP/Parser/IteratorFactory.pm C​:/p523/src/lib/TAP/Parser/Iterator/Process.pm C​:/p523/src/lib/TAP/Parser/Iterator/Process.pm TAP/Parser/Iterator.pm _<C​:/p523/src/lib/POSIX.pm C​:/p523/src/lib/POSIX.pm _<C​:/p523/src/lib/Fcntl.pm C​:/p523/src/lib/Fcntl.pm C​:/p523/src/lib/POSIX.pm C​:/p523/src/lib/POSIX.pm C​:/p523/src/lib/POSIX.pm C​:/p523/src/lib/Fcntl.pm C​:/p523/src/lib/Fcntl.pm C​:/p523/src/lib/TAP/Parser/Iterator.pm C​:/p523/src/lib/TAP/Parser/Iterator.pm _<C​:/p523/src/lib/TAP/Parser/SourceHandler/Executable.pm C​:/p523/src/lib/TAP/Parser/SourceHandler/Executable.pm _<C​:/p523/src/lib/TAP/Parser/SourceHandler.pm C​:/p523/src/lib/TAP/Parser/SourceHandler.pm Text/ParseWords.pm C​:/p523/src/lib/Text/ParseWords.pm C​:/p523/src/lib/Text/ParseWords.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/XSLoader.pm C​:/p523/src/lib/Tie/Hash.pm C​:/p523/src/lib/Tie/Hash.pm TAP/Parser/SourceHandler.pm C​:/p523/src/lib/Test/Builder/Module.pm C​:/p523/src/lib/Test/Builder/Module.pm C​:/p523/src/lib/Test/Builder/Module.pm C​:/p523/src/lib/Test/Builder.pm C​:/p523/src/lib/Test/Builder.pm C​:/p523/src/lib/Test/More.pm C​:/p523/src/lib/Test/More.pm Test/Builder/Module.pm C​:/p523/src/lib/PerlIO.pm C​:/p523/src/lib/PerlIO.pm C​:/p523/src/lib/PerlIO.pm C​:/p523/src/lib/PerlIO.pm /p523/src/lib/Exporter/Heavy.pm   -V[​:variable] print configuration summary (or a single Config.pm variable)

p5pRT avatar Mar 02 '16 21:03 p5pRT

From @bulk88

On Wed Mar 02 13​:35​:22 2016, bulk88 wrote​:

Unthreaded perl, which my branch doesn't touch the bahavior of, also has a duplicate .pm paths in memory problem, but not as big as threaded. But it is big enough that I think the CHEK API needs to also be on unthreaded.

I added a commit to the branch that uses CHEK API on unthreaded.

perl -MTest​::Harness -MTest​::More -e"sleep 1000"

b4 4812 KB after 4804 KB

So 8 KB is saved. It is a little, not very much, but it is something. Its not as big as a savings as I thought it would be.

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Mar 04 '16 09:03 p5pRT

From @bulk88

On Fri Mar 04 01​:05​:24 2016, bulk88 wrote​:

I added a commit to the branch that uses CHEK API on unthreaded.

perl -MTest​::Harness -MTest​::More -e"sleep 1000"

b4 4812 KB after 4804 KB

So 8 KB is saved. It is a little, not very much, but it is something. Its not as big as a savings as I thought it would be.

There were some optimizations I forgot to do in the unthreaded build, so 20KB are saved, not 8KB,

5140 kb b4 5120 kb after

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Mar 04 '16 18:03 p5pRT

From @rjbs

This ticket could sure use some replies from technical eyes.

My understanding — and please correct me if I'm wrong, bulk88 — is that http​://perl5.git.perl.org/perl.git/commitdiff/345d4464184a234301341596f73ee2d3550c9799 (roughly) gets us a few kilobytes of heap saved per file loaded.

To me, this seems to multiply the total number of entity types in the implementation without sufficiently benefiting from the increase in complexity. That said, the implementation is a place where I am much more likely to listen to outside opinions. ;) So, please, readers​: speak up.

-- rjbs

p5pRT avatar Mar 09 '16 02:03 p5pRT

From @tonycoz

On Wed Mar 02 13​:35​:22 2016, bulk88 wrote​:

I am still waiting for feedback, or everyone agree with the design so they are staying quiet?

I think it makes sense, at least for threads.

I do think the ref counting functions need names that indicate what they're incing/deccing​:

p |void |chek_inc |NN CHEK * chek p |void |chek_dec |NN CHEK * chek

maybe chek_ref_(inc|dec).

This code from newchek() seems like it could be more efficient​:

  /* was alloca */   buf = sv_grow(sv_newmortal(),len); ...   hek = save_hek_flags(buf, len, hash, HVhek_COMPILING);

Rather than creating an SV then growing it, why not just allocate the memory directly and add HVhek_FREEKEY to the flags passed to save_hek_flags().

For use in non-threads, I suspect code that uses a lot of #line directives (generated code, eg. by Mason) could result in an increase in memory usages with CHEKs.

I don't think the changes belong in 5.24.

Tony

p5pRT avatar Mar 09 '16 05:03 p5pRT

From @tonycoz

On Tue Mar 08 21​:23​:04 2016, tonyc blathered​:

...

Forgot to mention, this introduced new warnings to the build​:

n file included from perl.h​:3904​:0,   from op.c​:103​: op.c​: In function ‘Perl_newSTATEOP’​: hv.h​:508​:39​: warning​: right-hand operand of comma expression has no effect [-Wunused-value]   ->shared_he_he.he_valu.hent_refcount), \   ^ hv.h​:510​:21​: note​: in expansion of macro ‘share_hek_hek’ #define chek_inc(x) share_hek_hek(FNPV2HEK(CHEK2FNPV((x))))   ^ op.c​:6589​:5​: note​: in expansion of macro ‘chek_inc’   chek_inc(chek);   ^ op.c​: In function ‘Perl_newXS_len_flags’​: hv.h​:508​:39​: warning​: right-hand operand of comma expression has no effect [-Wunused-value]   ->shared_he_he.he_valu.hent_refcount), \   ^ hv.h​:510​:21​: note​: in expansion of macro ‘share_hek_hek’ #define chek_inc(x) share_hek_hek(FNPV2HEK(CHEK2FNPV((x))))   ^ op.c​:8994​:21​: note​: in expansion of macro ‘chek_inc’   chek_inc(chek);   ^ Tony

p5pRT avatar Mar 09 '16 05:03 p5pRT

From @iabyn

On Fri, Feb 26, 2016 at 04​:01​:11AM -0800, bulk88 via RT wrote​:

How does your solution work, and how (if at all) does it interact with or change other parts of perl? [stuff]

I'm sorry, I'm finding your descriptions *really* hard to follow.

What I would really appreciate is an overall "big picture" description of what your solution is, rather than a mess of detail.

As I understand it, the issue is that at the moment on threaded builds, every COP for all code compiled from a particular src file contains a pointer to a malloc()ed copy of the current src filename. This results in much duplication.

So you have a solution that aims to reduce this duplication, by sharing the filename strings across most (all) COPs in a file. Is this right?

This sharing is done using a structure called a CHEK, which is basically a HEK (which contains a string, a length and a hash) plus a reference count. Is this right?

So some questions which immediately occur to me​:

* How is the de-duplication done?

* how is change of filename handled, e.g. C<#line 100 "foo">?

* HEK's are normally stored in hashes. Are CHEKs stored in hashes too?

* If so, what hash, and where is this hash stored?

* Also if so, how is this hash accessed across threads?

* If not, why is it a CHEK rather than something unassociated with hashes?   And what is the hash value then used for?

-- You live and learn (although usually you just live).

p5pRT avatar Mar 09 '16 16:03 p5pRT

From @bulk88

On Wed Mar 09 08​:40​:44 2016, davem wrote​:

On Fri, Feb 26, 2016 at 04​:01​:11AM -0800, bulk88 via RT wrote​:

How does your solution work, and how (if at all) does it interact with or change other parts of perl? [stuff]

I'm sorry, I'm finding your descriptions *really* hard to follow.

What I would really appreciate is an overall "big picture" description of what your solution is, rather than a mess of detail.

As I understand it, the issue is that at the moment on threaded builds, every COP for all code compiled from a particular src file contains a pointer to a malloc()ed copy of the current src filename. This results in much duplication.

Correct.

So you have a solution that aims to reduce this duplication, by sharing the filename strings across most (all) COPs in a file. Is this right?

Correct.

This sharing is done using a structure called a CHEK, which is basically a HEK (which contains a string, a length and a hash) plus a reference count. Is this right?

Yes. It is derived from a HEK. It is smaller/lighter weight than the existing "struct shared_he" HEK and was inspired by the "struct shared_he" HEK.

So some questions which immediately occur to me​:

* How is the de-duplication done?

Ref counting increase of an existing resource (CHEK) pointer. There is no 100% deduping because PL_strtab is NOT used (but PL_strtab isn't shared between ithreads today anyway). There is a way to defeat the current deduping code, but I feel it is pointless to fix this since this is so rare, and the worst case scenario is a regression to the current 1 malloc-ed path per COP situation today. To defeat the deduping, "require Foo;", then delete the %INC entry for Foo, then replace Foo.pm on disk with a different contents/different sub names file, also named Foo.pm, then "require Foo;" again. Now there are 2 or more COPs in the process, with identical filenames, but different CHEK *s.

* how is change of filename handled, e.g. C<#line 100 "foo">?

Existing CopFILE_free/CopFILE_set/CopFILE_setn calls in core modifying PL_curcop or PL_compiling.

* HEK's are normally stored in hashes. Are CHEKs stored in hashes too?

No. PL_strtab is not used. A CHEK * will never be in a HE *. A CHEK * does know its hash number for faster *{'_<Foo.pm'} aka gv_fetchfile* execution, but the CHEK never gets store in a HE *. Perl core already has a HEK that is not stored in PL_strtab called HVhek_UNSHARED flag. I took inspiration from HVhek_UNSHARED to create a CHEK.

* If so, what hash, and where is this hash stored?

* Also if so, how is this hash accessed across threads?

My wild guess is putting a mutex around PL_strtab would cause performance problems, that is why I didn't try to make PL_strtab shared between ithreads. All ithreads inherit the hash seed of their parent, so hash numbers for 1 particular string can be shared between 2 ithreads, PL_hash_seed_set/PL_hash_seed are per-interp globals, but they behave almost like per-process globals (I can only see 2 different hash seeds in 1 process under the following situation, 2 different shared libraries both embedding perl starting up 2 interps with perl_alloc/perl_parse/perl_run, but in that case, no pointers will ever cross between the 2 perl interps.

* If not, why is it a CHEK rather than something unassociated with hashes?

"struct refcounted_he" is a strange little ****SERIALIZATION**** format for serializing a HV* into a linked list structure shared between threads. "struct refcounted_he" can't be COWed or the string buffers stored in in SV *s. It is too bloated (storing IVs, etc, we only need strings), too specialized (linked list stuff). So "struct refcounted_he" just doesn't work. HEKs are an immutable string type and fit the bill. Once a HEK * is created, it will never change. A HEK knows its length, and knows its hash number (gives a lil perf boost to for gv_fetchfile, which is now gv_fetchfile_hek). struct shared_he, which contains an inline HEK, had a reference count member. So a CHEK * is a cut down "struct shared_he *". The CHEK fits nicely for the design requirements of the CopFILE problem.

Design Requirements​:

-must know its hash number for gv_fetchfile -string buffer must be COW storable inside SV *s -must know its length -must be reference counted -must be stored in shared memory, not per interp memory

And what is the hash value then used for?

To speed up the indirection that gv_fetchfile/CopFILEGV/CopFILESV/CopFILEAV function/macro calls use under ithreads since GV *s (and SV*s) can't be stored in the optree. On threads, constant SVs are also stored with indirection, with pad offsets in the OP struct, instead of an SV * in an OP struct (as on unthreaded).

-- bulk88 ~ bulk88 at hotmail.com

p5pRT avatar Mar 09 '16 21:03 p5pRT