Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
p5pRT opened this issue May 30, 2015 · 53 comments
Open

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

p5pRT opened this issue May 30, 2015 · 53 comments

Comments

@p5pRT
Copy link

p5pRT commented May 30, 2015

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

Searchable as RT125296$

@p5pRT
Copy link
Author

p5pRT commented May 30, 2015

From @bulk88

Created by @bulk88

commit a636914 "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
a636914 "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
Copy link
Author

p5pRT commented May 30, 2015

From @bulk88

monkey_burning_money.jpg

@p5pRT
Copy link
Author

p5pRT commented May 30, 2015

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
Copy link
Author

p5pRT commented May 30, 2015

From @bulk88

filenameGV.PNG

@p5pRT
Copy link
Author

p5pRT commented May 30, 2015

From @bulk88

perl.exe_nothd.diff

@p5pRT
Copy link
Author

p5pRT commented May 30, 2015

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
Copy link
Author

p5pRT commented May 30, 2015

From @bulk88

perl.exe_thd.diff

@p5pRT
Copy link
Author

p5pRT commented May 30, 2015

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
Copy link
Author

p5pRT commented Jul 7, 2015

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
Copy link
Author

p5pRT commented Jul 7, 2015

From @bulk88

0001-WIP-remove-CvFILE.patch
From 6c737e3bd8b7626a5caf5401db7279421bfdbdcc Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
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
Copy link
Author

p5pRT commented Jul 7, 2015

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
Copy link
Author

p5pRT commented Jul 7, 2015

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

@p5pRT
Copy link
Author

p5pRT commented Jul 9, 2015

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
Copy link
Author

p5pRT commented Jul 9, 2015

From @bulk88

0001-dont-report-a-exception-with-uninitialized-s-message.patch
From c43b488191f961a0a77462f931b04e4915b215af Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
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
Copy link
Author

p5pRT commented Jul 9, 2015

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
Copy link
Author

p5pRT commented Jul 9, 2015

From @bulk88

0001-wip-CvFILE-mem-waste.patch
From 116483b264e69135efcd1a639655caca36d1e1db Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
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
Copy link
Author

p5pRT commented Jul 19, 2015

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
Copy link
Author

p5pRT commented Feb 16, 2016

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
Copy link
Author

p5pRT commented Feb 17, 2016

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
Copy link
Author

p5pRT commented Feb 26, 2016

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
Copy link
Author

p5pRT commented Feb 26, 2016

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
Copy link
Author

p5pRT commented Mar 2, 2016

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
Copy link
Author

p5pRT commented Mar 2, 2016

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
Copy link
Author

p5pRT commented Mar 4, 2016

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
Copy link
Author

p5pRT commented Mar 4, 2016

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
Copy link
Author

p5pRT commented Mar 9, 2016

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
Copy link
Author

p5pRT commented Mar 9, 2016

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
Copy link
Author

p5pRT commented Mar 9, 2016

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
Copy link
Author

p5pRT commented Mar 9, 2016

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
Copy link
Author

p5pRT commented Mar 9, 2016

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
Copy link
Author

p5pRT commented Mar 9, 2016

From @tonycoz

On Wed Mar 09 13​:33​:31 2016, bulk88 wrote​:

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.

You can get multiple CHEKs for the same name with #line directives too, which was the reason I suggested it was a bad idea for non-threaded builds. It's still a big improvement for threaded builds in the general case.

The attached code demonstrates the different CHEKs for the same name.

While this is unlikely for most use written code, it's a problem for code generated by a pre-processor or translator, common for templating tools.

Perhaps adding a per-thread hash of the CHEKs would reduce that duplication.

Tony

@p5pRT
Copy link
Author

p5pRT commented Mar 9, 2016

From @tonycoz

copfileheks.pl

@p5pRT
Copy link
Author

p5pRT commented Mar 10, 2016

From @timbunce

On Tue, Mar 08, 2016 at 06​:17​:54PM -0800, Ricardo SIGNES via RT wrote​:

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.

And a saving per string eval?

Presumably related... this is something that dismays me everytime I run strings on a core file​:

$ perl -MMoose -e 'system("gcore $$ && strings core.$$")'| grep Moose | sort | uniq -c | sort -rn | head
  540 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Meta/Attribute.pm
  475 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Exporter.pm
  326 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Meta/Class.pm
  302 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Util/TypeConstraints.pm
  260 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Meta/Role.pm
  255 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Util.pm
  184 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Meta/TypeConstraint.pm
  173 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Meta/Role/Application/RoleSummation.pm
  169 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Util/TypeConstraints/Builtins.pm
  154 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose.pm

Why are there hundreds of copies of those paths?

Tim.

p.s. That was perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux-thread-multi

p.p.s. I'm not picking on Moose here, it's just a handy example.
If I don't filter the output strings for Moose then other items pop up​:

$ perl -MMoose -e 'system("gcore $$ && strings core.$$")'| sort | uniq -c | sort -rn |head
  2832 UTF-8
  841 ISO-8859-1
  654 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Class/MOP/Class.pm
  544 $self
  540 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Meta/Attribute.pm
  475 /home/tim/trunk/cpan/cpan-5.020/lib/perl5/x86_64-linux-thread-multi/Moose/Exporter.pm
  385 i18n​:2000
  341 %a %b %e %H​:%M​:%S %Z %Y
  340 ISO-8859-15
  331 %d%t%g%t%m%t%f

2832 copies of "UTF-8"?!

@p5pRT
Copy link
Author

p5pRT commented Mar 11, 2016

From @bulk88

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

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).

Wouldn't "chek_ref_inc" means a CHEK **?

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().

I rewrote Perl_newchek() in the branch into its final version. Only 1 buffer, the final CHEK *, is ever allocated as you suggested.

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.

On Wed Mar 09 15​:36​:14 2016, tonyc wrote​:

You can get multiple CHEKs for the same name with #line directives
too, which was the reason I suggested it was a bad idea for non-
threaded builds. It's still a big improvement for threaded builds in
the general case.

The attached code demonstrates the different CHEKs for the same name.

While this is unlikely for most use written code, it's a problem for
code generated by a pre-processor or translator, common for templating
tools.

Perhaps adding a per-thread hash of the CHEKs would reduce that
duplication.

Tony

I fixed most of that #line problem in commit "dont realloc CopFILE if filename stays the same in "#line 1234 "file.pm"""


use Inline C => <<'EOS';
void dump_cc_file() {
  fprintf(stderr, "cop %p %p %s\n", PL_curcop, CopFILE(PL_curcop), CopFILE(PL_curcop));
}
EOS

dump_cc_file();

#line 10 "copfileheks.pl"

dump_cc_file();
#line 13 "copfileheks.pl"
dump_cc_file();

#line 15 "copfileheks.pl"
dump_cc_file();

#line 16 "copfileheks.pl"
dump_cc_file();

#line 17 "second.pl"
dump_cc_file();

#line 18 "copfileheks.pl"
dump_cc_file();
#line 19 "copfileheks.pl"
dump_cc_file();
#line 20 "copfileheks.pl"
dump_cc_file();


cop 00E0F278 0036CEEA t.pl
cop 00E0F19C 003903BA copfileheks.pl
cop 00D1B7F0 003903BA copfileheks.pl
cop 00D1B734 003903BA copfileheks.pl
cop 00D1B654 003903BA copfileheks.pl
cop 00D1B574 00399AF2 second.pl
cop 00D1B494 00D271EA copfileheks.pl
cop 0041E7B8 00D271EA copfileheks.pl
cop 0041E6D8 00D271EA copfileheks.pl


"Perhaps adding a per-thread hash of the CHEKs would reduce that duplication." If I/someone really wants to implement that, there is a way. Current without $^P, on blead the globs are only created on unthreaded perl, threaded perl doesn't have the globs in main​:: unless $^P was modified, also on CHEK threaded perl, those globs also dont exist in main​:: on threads unless $^P is modified. I can change it so the *{'_<Foo.pm'} glob is always created (this increases memory usage of threaded perl by default in all permutations), or start creating the debugging globs on threaded perl only once the first #line is ever seen by yylex, then inside S_incline, just do gv_fetchfile and go inside GvSV(gv) of the *{'_<Foo.pm'} and that scalar will be a SV CHEK COW in *most cases*, and from that the CHEK * from the SV* can be obtained then ++ed and put in the next COP *'s copfile. main​:: package is the deduping hash but it isn't very noticeable from PP land (remember unthreaded blead perl has always created these globs in main​:: since perl 4 or earlier). If someone deleted the SCALAR in *{'_<Foo.pm'}, just create another CHEK for the next COP and use more memory, you can't win the war if someone is actively trying to burn memory by modifying SCALAR in *{'_<Foo.pm'} in BEGIN blocks between #lines. I assume that within 1 file, all the #line statements will have the same file name, and it wont be that every #line directive is a different filename from the last #line, so the *{'_<Foo.pm'}{SCALAR} as a deduping table idea I dont think is needed.

The other choice for aggressive deduping for random filenames in #line is modify PL_strtab so the HE and HEK aren't the same malloc block anymore, or stuff a flag (turn hent_refcount into a bitfield and steal a bit) or something into the HE that the HEK doesn't follow the HE for that strtab key/hash entry (perhaps NULL for the HEK). This also means that CHEKs can wind up in regular hash HE structs now. There would also have to be a mechanism for upgrading a SHEK in PL_strtab to a CHEK, or detaching a SHEK from PL_strtab and putting a CHEK in its place. The SHEK * could potentially have references from existing HEs, so it can't be dealloced. The HEK * to HEK * comparison HV linked list search code loop in Perl_hv_common might make it impossible to have any "upgrade" concept of a SHEK * to a CHEK *. Another idea is all SHEKs become CHEKs allocated in shared memory pool, SHEKs as they are known today are eliminated on threaded perl. Atomic operations are used on the refcount of the CHEK to avoid contention on OP_REFCNT_LOCK/OP_REFCNT_UNLOCK mutex on every hash entry create/delete operation. PL_strtab stays per interp but the CHEK and PL_strtab HE are 2 different mem blocks now. ithreads would take less memory when they copy the world since hash keys CHEKs are just ++ed during the clone, not new malloc blocks.

I like choice 1 if aggressive deduping is a design requirement (every #line in the file has a different filename than the last #line) and I can see it easily being implemented.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

p5pRT commented Mar 11, 2016

From @bulk88

On Thu Mar 10 06​:45​:07 2016, timbo wrote​:

Why are there hundreds of copies of those paths?

Tim.

Are you using threaded or unthreaded perl? If you are using threaded perl, you are now the 2nd reporter of the "bug" described in this ticket after me ;)

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

p5pRT commented Mar 11, 2016

From @timbunce

On Fri, Mar 11, 2016 at 12​:05​:30PM -0800, bulk88 via RT wrote​:

On Thu Mar 10 06​:45​:07 2016, timbo wrote​:

Why are there hundreds of copies of those paths?

Tim.

Are you using threaded or unthreaded perl? If you are using threaded perl, you are now the 2nd reporter of the "bug" described in this ticket after me ;)

.../x86_64-linux-thread-multi/...

I recall reporting something like this in 2012 around the time I worked on Devel​::SizeMe
http​://blog.timbunce.org/2012/10/05/introducing-develsizeme-visualizing-perl-memory-use/
https://archive.org/details/Timbunce_DevelSizeMeAtYAPCNA2013

I thought that the specific issue shown up by the Devel​::SizeMe
visualization (CopFILE's I think) had been fixed, so maybe this is a
slightly different issue, or I'm mistaken about it having been fixed.

Either way, there's still clearly a problem.

Tim.

@p5pRT
Copy link
Author

p5pRT commented Mar 11, 2016

From @cpansprout

On Fri Mar 11 12​:32​:20 2016, timbo wrote​:

On Fri, Mar 11, 2016 at 12​:05​:30PM -0800, bulk88 via RT wrote​:

On Thu Mar 10 06​:45​:07 2016, timbo wrote​:

Why are there hundreds of copies of those paths?

Tim.

Are you using threaded or unthreaded perl? If you are using threaded
perl, you are now the 2nd reporter of the "bug" described in this
ticket after me ;)

.../x86_64-linux-thread-multi/...

I recall reporting something like this in 2012 around the time I
worked on Devel​::SizeMe
http​://blog.timbunce.org/2012/10/05/introducing-develsizeme-
visualizing-perl-memory-use/
https://archive.org/details/Timbunce_DevelSizeMeAtYAPCNA2013

I thought that the specific issue shown up by the Devel​::SizeMe
visualization (CopFILE's I think) had been fixed, so maybe this is a
slightly different issue, or I'm mistaken about it having been fixed.

It was ‘fixed’ for a while in blead, but some smokers started crashing. I realised my approach was fundamentally flawed and reverted it. I believe your ticket it still open, but I do not remember the number offhand.

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Mar 12, 2016

From @bulk88

On Thu Mar 10 06​:45​:07 2016, timbo wrote​:

Presumably related... this is something that dismays me everytime I
run strings on a core file​:

$ perl -MMoose -e 'system("gcore $$ && strings core.$$")'| grep Moose
| sort | uniq -c | sort -rn | head

On my CopFILE branch perl (currently SHA-1​: 304db02, with commit "dont realloc CopFILE if filename stays the same in "#line 1234 "file.pm"""), threaded, with prog "perl -MMoose -e "sleep 1000"", core dump of it, strings -n16, then grep and sort for all lines containing ".pm", I got the following file which I attached. It seems Moose's Eval​::Closure dep is using the filepath part of #line to store arbitrary data (wrong prototype warning message) :-/

It looks like there are 2-4 identical CHEKs ("_<" prefixed strings) being created, and 1 missed COW opportunity for each Eval​::Closure sub. I will need to investigate this a bit more.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

p5pRT commented Mar 12, 2016

From @bulk88

  -V[​:variable] print configuration summary (or a single Config.pm variable)
(defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)"
#line 1 "accessor Moose​::Meta​::Role​::Application​::ToClass​::class (defined at C​:/p523/site/lib/Moose.pm line 36)"
#line 1 "accessor Moose​::Meta​::TypeCoercion​::_compiled_type_coercion of attribute compiled_type_coercion (defined at C​:/p523/site/lib/Moose.pm line 26)"
#line 1 "constructor Moose​::Meta​::Role​::Application​::ToClass​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "constructor Moose​::Meta​::Role​::Application​::ToClass​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "constructor Moose​::Meta​::Role​::Application​::ToInstance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "constructor Moose​::Meta​::Role​::Application​::ToRole​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "constructor Moose​::Meta​::Role​::Composite​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "constructor Moose​::Meta​::Role​::Composite​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "constructor Moose​::Meta​::Role​::Method​::Required​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_documentation of attribute documentation (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_type_constraint of attribute type_constraint (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_type_constraint of attribute type_constraint (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::Mixin​::AttributeCore​::has_type_constraint of attribute type_constraint (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "predicate Moose​::Meta​::TypeConstraint​::Registry​::has_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)"
#line 1 "predicate Moose​::Meta​::TypeConstraint​::has_parent of attribute parent (defined at C​:/p523/site/lib/Moose.pm line 25)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy_build of attribute lazy_build (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy_build of attribute lazy_build (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::should_auto_deref of attribute auto_deref (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::should_auto_deref of attribute auto_deref (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)"
#line 1 "reader Moose​::Meta​::Role​::Application​::ToClass​::role (defined at C​:/p523/site/lib/Moose.pm line 36)"
#line 1 "reader Moose​::Meta​::Role​::Application​::get_method_aliases of attribute method_aliases (defined at C​:/p523/site/lib/Moose.pm line 34)"
#line 1 "reader Moose​::Meta​::Role​::Application​::get_method_aliases of attribute method_aliases (defined at C​:/p523/site/lib/Moose.pm line 34)"
#line 1 "reader Moose​::Meta​::Role​::Composite​::name (defined at C​:/p523/site/lib/Moose.pm line 33)"
#line 1 "reader Moose​::Meta​::Role​::get_roles of attribute roles (defined at C​:/p523/site/lib/Moose.pm line 32)"
(?^​: at .+?Runtime\.pm line [0-9]+\.$)
/site/lib/Moose.pm line 243)"
:/p523/site/lib/Moose.pm line 25)"
AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)"
C​:\p523\site\lib\Moose\Meta\Attribute\Native.pm
Class/Load/XS.pm
Class/MOP/Attribute.pm
Class/MOP/Class.pm
Class/MOP/Class/Immutable/Class/MOP/Class.pm
Class/MOP/Class/Immutable/Trait.pm
Class/MOP/Deprecated.pm
Class/MOP/Instance.pm
Class/MOP/Method.pm
Class/MOP/Method/Accessor.pm
Class/MOP/Method/Constructor.pm
Class/MOP/Method/Generated.pm
Class/MOP/Method/Inlined.pm
Class/MOP/Method/Meta.pm
Class/MOP/Method/Wrapped.pm
Class/MOP/MiniTrait.pm
Class/MOP/Mixin.pm
Class/MOP/Mixin/AttributeCore.pm
Class/MOP/Mixin/AttributeCore.pm
Class/MOP/Mixin/HasAttributes.pm
Class/MOP/Mixin/HasMethods.pm
Class/MOP/Mixin/HasOverloads.pm
Class/MOP/Module.pm
Class/MOP/Object.pm
Class/MOP/Object.pm
Class/MOP/Object.pm
Class/MOP/Overload.pm
Class/MOP/Package.pm
Devel/GlobalDestruction.pm
Devel/LexAlias.pm
Devel/OverloadInfo.pm
Devel/PartialDump.pm
Exporter/Heavy.pm
Exporter/Tiny.pm
List/MoreUtils.pm
List/MoreUtils/PP.pm
List/MoreUtils/XS.pm
Module/Implementation.pm
Module/Runtime.pm
Moose/Deprecated.pm
Moose/Exporter.pm
Moose/Meta/Attribute.pm
Moose/Meta/Attribute/Native.pm
Moose/Meta/Class.pm
Moose/Meta/Class/Immutable/Trait.pm
Moose/Meta/Instance.pm
Moose/Meta/Method.pm
Moose/Meta/Method/Accessor.pm
Moose/Meta/Method/Augmented.pm
Moose/Meta/Method/Constructor.pm
Moose/Meta/Method/Delegation.pm
Moose/Meta/Method/Destructor.pm
Moose/Meta/Method/Meta.pm
Moose/Meta/Method/Overridden.pm
Moose/Meta/Mixin/AttributeCore.pm
Moose/Meta/Object/Trait.pm
Moose/Meta/Role.pm
Moose/Meta/Role/Application.pm
Moose/Meta/Role/Application.pm
Moose/Meta/Role/Application/RoleSummation.pm
Moose/Meta/Role/Application/ToClass.pm
Moose/Meta/Role/Application/ToInstance.pm
Moose/Meta/Role/Application/ToRole.pm
Moose/Meta/Role/Attribute.pm
Moose/Meta/Role/Composite.pm
Moose/Meta/Role/Method.pm
Moose/Meta/Role/Method/Conflicting.pm
Moose/Meta/Role/Method/Required.pm
Moose/Meta/TypeCoercion.pm
Moose/Meta/TypeCoercion/Union.pm
Moose/Meta/TypeConstraint.pm
Moose/Meta/TypeConstraint/Class.pm
Moose/Meta/TypeConstraint/DuckType.pm
Moose/Meta/TypeConstraint/Enum.pm
Moose/Meta/TypeConstraint/Parameterizable.pm
Moose/Meta/TypeConstraint/Parameterized.pm
Moose/Meta/TypeConstraint/Registry.pm
Moose/Meta/TypeConstraint/Role.pm
Moose/Meta/TypeConstraint/Union.pm
Moose/Util/MetaRole.pm
Moose/Util/TypeConstraints.pm
Moose/Util/TypeConstraints/Builtins.pm
Moose​::Meta​::Class.pm
Package/DeprecationManager.pm
Package/Stash.pm
Package/Stash/XS.pm
Runtime.pm line
Runtime.pm line
Sub/Exporter/Progressive.pm
_<C​:/p523/lib/B.pm
_<C​:/p523/lib/Carp.pm
_<C​:/p523/lib/Config.pm
_<C​:/p523/lib/DynaLoader.pm
_<C​:/p523/lib/Exporter.pm
_<C​:/p523/lib/List/Util.pm
_<C​:/p523/lib/Scalar/Util.pm
_<C​:/p523/lib/Sub/Util.pm
_<C​:/p523/lib/XSLoader.pm
_<C​:/p523/lib/base.pm
_<C​:/p523/lib/constant.pm
_<C​:/p523/lib/if.pm
_<C​:/p523/lib/mro.pm
_<C​:/p523/lib/overload.pm
_<C​:/p523/lib/overloading.pm
_<C​:/p523/lib/parent.pm
_<C​:/p523/lib/re.pm
_<C​:/p523/lib/strict.pm
_<C​:/p523/lib/vars.pm
_<C​:/p523/lib/warnings.pm
_<C​:/p523/lib/warnings/register.pm
_<C​:/p523/site/lib/Class/Load.pm
_<C​:/p523/site/lib/Class/Load/XS.pm
_<C​:/p523/site/lib/Class/MOP.pm
_<C​:/p523/site/lib/Class/MOP/Attribute.pm
_<C​:/p523/site/lib/Class/MOP/Class.pm
_<C​:/p523/site/lib/Class/MOP/Class/Immutable/Trait.pm
_<C​:/p523/site/lib/Class/MOP/Deprecated.pm
_<C​:/p523/site/lib/Class/MOP/Instance.pm
_<C​:/p523/site/lib/Class/MOP/Method.pm
_<C​:/p523/site/lib/Class/MOP/Method/Accessor.pm
_<C​:/p523/site/lib/Class/MOP/Method/Constructor.pm
_<C​:/p523/site/lib/Class/MOP/Method/Generated.pm
_<C​:/p523/site/lib/Class/MOP/Method/Inlined.pm
_<C​:/p523/site/lib/Class/MOP/Method/Meta.pm
_<C​:/p523/site/lib/Class/MOP/Method/Wrapped.pm
_<C​:/p523/site/lib/Class/MOP/MiniTrait.pm
_<C​:/p523/site/lib/Class/MOP/Mixin.pm
_<C​:/p523/site/lib/Class/MOP/Mixin/AttributeCore.pm
_<C​:/p523/site/lib/Class/MOP/Mixin/HasAttributes.pm
_<C​:/p523/site/lib/Class/MOP/Mixin/HasMethods.pm
_<C​:/p523/site/lib/Class/MOP/Mixin/HasOverloads.pm
_<C​:/p523/site/lib/Class/MOP/Module.pm
_<C​:/p523/site/lib/Class/MOP/Object.pm
_<C​:/p523/site/lib/Class/MOP/Overload.pm
_<C​:/p523/site/lib/Class/MOP/Package.pm
_<C​:/p523/site/lib/Data/OptList.pm
_<C​:/p523/site/lib/Devel/GlobalDestruction.pm
_<C​:/p523/site/lib/Devel/OverloadInfo.pm
_<C​:/p523/site/lib/Eval/Closure.pm
_<C​:/p523/site/lib/Exporter/Tiny.pm
_<C​:/p523/site/lib/List/MoreUtils.pm
_<C​:/p523/site/lib/List/MoreUtils/PP.pm
_<C​:/p523/site/lib/List/MoreUtils/XS.pm
_<C​:/p523/site/lib/MRO/Compat.pm
_<C​:/p523/site/lib/Module/Implementation.pm
_<C​:/p523/site/lib/Module/Runtime.pm
_<C​:/p523/site/lib/Moose.pm
_<C​:/p523/site/lib/Moose/Deprecated.pm
_<C​:/p523/site/lib/Moose/Exporter.pm
_<C​:/p523/site/lib/Moose/Meta/Attribute.pm
_<C​:/p523/site/lib/Moose/Meta/Attribute/Native.pm
_<C​:/p523/site/lib/Moose/Meta/Class.pm
_<C​:/p523/site/lib/Moose/Meta/Class/Immutable/Trait.pm
_<C​:/p523/site/lib/Moose/Meta/Instance.pm
_<C​:/p523/site/lib/Moose/Meta/Method.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Accessor.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Augmented.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Constructor.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Delegation.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Destructor.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Meta.pm
_<C​:/p523/site/lib/Moose/Meta/Method/Overridden.pm
_<C​:/p523/site/lib/Moose/Meta/Mixin/AttributeCore.pm
_<C​:/p523/site/lib/Moose/Meta/Object/Trait.pm
_<C​:/p523/site/lib/Moose/Meta/Role.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Application.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Application/RoleSummation.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Application/ToClass.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Application/ToInstance.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Application/ToRole.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Attribute.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Composite.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Method.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Method/Conflicting.pm
_<C​:/p523/site/lib/Moose/Meta/Role/Method/Required.pm
_<C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm
_<C​:/p523/site/lib/Moose/Meta/TypeCoercion/Union.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Class.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/DuckType.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Enum.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterizable.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Registry.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Role.pm
_<C​:/p523/site/lib/Moose/Meta/TypeConstraint/Union.pm
_<C​:/p523/site/lib/Moose/Object.pm
_<C​:/p523/site/lib/Moose/Util.pm
_<C​:/p523/site/lib/Moose/Util/MetaRole.pm
_<C​:/p523/site/lib/Moose/Util/TypeConstraints.pm
_<C​:/p523/site/lib/Moose/Util/TypeConstraints/Builtins.pm
_<C​:/p523/site/lib/Package/DeprecationManager.pm
_<C​:/p523/site/lib/Package/Stash.pm
_<C​:/p523/site/lib/Package/Stash/XS.pm
_<C​:/p523/site/lib/Params/Util.pm
_<C​:/p523/site/lib/Sub/Exporter.pm
_<C​:/p523/site/lib/Sub/Exporter/Progressive.pm
_<C​:/p523/site/lib/Sub/Identify.pm
_<C​:/p523/site/lib/Sub/Install.pm
_<C​:/p523/site/lib/Sub/Name.pm
_<C​:/p523/site/lib/Try/Tiny.pm
_<C​:/p523/site/lib/metaclass.pm
_<accessor Moose​::Meta​::Class​::constructor_class (defined at C​:/p523/site/lib/Moose.pm line 24)
_<accessor Moose​::Meta​::Class​::constructor_class (defined at C​:/p523/site/lib/Moose.pm line 24)
_<accessor Moose​::Meta​::Class​::destructor_class (defined at C​:/p523/site/lib/Moose.pm line 24)
_<accessor Moose​::Meta​::Class​::destructor_class (defined at C​:/p523/site/lib/Moose.pm line 24)
_<accessor Moose​::Meta​::Class​::immutable_trait (defined at C​:/p523/site/lib/Moose.pm line 24)
_<accessor Moose​::Meta​::Class​::immutable_trait (defined at C​:/p523/site/lib/Moose.pm line 24)
_<accessor Moose​::Meta​::Role​::Application​::ToClass​::class (defined at C​:/p523/site/lib/Moose.pm line 36)
_<accessor Moose​::Meta​::Role​::Application​::ToClass​::class (defined at C​:/p523/site/lib/Moose.pm line 36)
_<accessor Moose​::Meta​::Role​::Composite​::_overload_fallback (defined at C​:/p523/site/lib/Moose.pm line 33)
_<accessor Moose​::Meta​::Role​::Composite​::_overload_fallback (defined at C​:/p523/site/lib/Moose.pm line 33)
_<accessor Moose​::Meta​::TypeCoercion​::_compiled_type_coercion of attribute compiled_type_coercion (defined at C​:/p523/site/lib/Moose.pm line 26)
_<accessor Moose​::Meta​::TypeCoercion​::_compiled_type_coercion of attribute compiled_type_coercion (defined at C​:/p523/site/lib/Moose.pm line 26)
_<accessor Moose​::Meta​::TypeConstraint​::DuckType​::methods (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 31)
_<accessor Moose​::Meta​::TypeConstraint​::DuckType​::methods (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 31)
_<accessor Moose​::Meta​::TypeConstraint​::Enum​::_inline_var_name (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 30)
_<accessor Moose​::Meta​::TypeConstraint​::Enum​::_inline_var_name (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 30)
_<accessor Moose​::Meta​::TypeConstraint​::Enum​::values (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 30)
_<accessor Moose​::Meta​::TypeConstraint​::Enum​::values (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 30)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterizable​::constraint_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterizable​::constraint_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterizable​::inline_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterizable​::inline_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterized​::parameterized_from (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterized​::parameterized_from (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterized​::type_parameter (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<accessor Moose​::Meta​::TypeConstraint​::Parameterized​::type_parameter (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<accessor Moose​::Meta​::TypeConstraint​::Union​::type_constraints (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::Union​::type_constraints (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_compiled_type_constraint of attribute compiled_type_constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_compiled_type_constraint of attribute compiled_type_constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_default_message (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_default_message (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_inline_environment of attribute inline_environment (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_inline_environment of attribute inline_environment (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_package_defined_in of attribute package_defined_in (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::_package_defined_in of attribute package_defined_in (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::coercion (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::coercion (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::inlined (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::inlined (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::message (defined at C​:/p523/site/lib/Moose.pm line 25)
_<accessor Moose​::Meta​::TypeConstraint​::message (defined at C​:/p523/site/lib/Moose.pm line 25)
_<constructor Moose​::Meta​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Class​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Class​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Instance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Instance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Augmented​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Augmented​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Constructor​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Constructor​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Destructor​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Destructor​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Overridden​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::Overridden​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Method​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::RoleSummation​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::RoleSummation​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::ToClass​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::ToClass​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::ToInstance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::ToInstance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::ToRole​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::ToRole​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Application​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Composite​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Composite​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Method​::Conflicting​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Method​::Conflicting​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Method​::Required​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Method​::Required​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Method​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::Method​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::Role​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::TypeCoercion​::Union​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::TypeCoercion​::Union​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::TypeCoercion​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::TypeCoercion​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
_<constructor Moose​::Meta​::TypeConstraint​::Class​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Class​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::DuckType​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::DuckType​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Enum​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Enum​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Parameterizable​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Parameterizable​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Parameterized​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Parameterized​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Registry​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Registry​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Role​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Role​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Union​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::Union​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<constructor Moose​::Meta​::TypeConstraint​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
_<predicate Moose​::Meta​::Attribute​::has_applied_traits of attribute traits (defined at C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm line 8)
_<predicate Moose​::Meta​::Attribute​::has_applied_traits of attribute traits (defined at C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm line 8)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_documentation of attribute documentation (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_documentation of attribute documentation (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_handles of attribute handles (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_handles of attribute handles (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_type_constraint of attribute type_constraint (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::Mixin​::AttributeCore​::has_type_constraint of attribute type_constraint (defined at C​:/p523/lib/parent.pm line 16)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterizable​::has_constraint_generator of attribute constraint_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterizable​::has_constraint_generator of attribute constraint_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterizable​::has_inline_generator of attribute inline_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterizable​::has_inline_generator of attribute inline_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterized​::has_parameterized_from of attribute parameterized_from (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterized​::has_parameterized_from of attribute parameterized_from (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterized​::has_type_parameter of attribute type_parameter (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<predicate Moose​::Meta​::TypeConstraint​::Parameterized​::has_type_parameter of attribute type_parameter (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
_<predicate Moose​::Meta​::TypeConstraint​::Registry​::has_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<predicate Moose​::Meta​::TypeConstraint​::Registry​::has_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<predicate Moose​::Meta​::TypeConstraint​::_has_compiled_type_constraint of attribute compiled_type_constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::_has_compiled_type_constraint of attribute compiled_type_constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::_has_inlined_type_constraint of attribute inlined (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::_has_inlined_type_constraint of attribute inlined (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::has_coercion of attribute coercion (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::has_coercion of attribute coercion (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::has_message of attribute message (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::has_message of attribute message (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::has_parent of attribute parent (defined at C​:/p523/site/lib/Moose.pm line 25)
_<predicate Moose​::Meta​::TypeConstraint​::has_parent of attribute parent (defined at C​:/p523/site/lib/Moose.pm line 25)
_<reader Moose​::Meta​::Attribute​::applied_traits of attribute traits (defined at C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm line 8)
_<reader Moose​::Meta​::Attribute​::applied_traits of attribute traits (defined at C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm line 8)
_<reader Moose​::Meta​::Class​::_get_role_applications of attribute role_applications (defined at C​:/p523/site/lib/Moose.pm line 24)
_<reader Moose​::Meta​::Class​::_get_role_applications of attribute role_applications (defined at C​:/p523/site/lib/Moose.pm line 24)
_<reader Moose​::Meta​::Class​::roles (defined at C​:/p523/site/lib/Moose.pm line 24)
_<reader Moose​::Meta​::Class​::roles (defined at C​:/p523/site/lib/Moose.pm line 24)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::_does_metadata of attribute does (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::_does_metadata of attribute does (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::_is_metadata of attribute is (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::_is_metadata of attribute is (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::_isa_metadata of attribute isa (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::_isa_metadata of attribute isa (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::documentation (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::documentation (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::handles (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::handles (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy_build of attribute lazy_build (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy_build of attribute lazy_build (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_required of attribute required (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_required of attribute required (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_weak_ref of attribute weak_ref (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::is_weak_ref of attribute weak_ref (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::should_auto_deref of attribute auto_deref (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::should_auto_deref of attribute auto_deref (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::should_coerce of attribute coerce (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::should_coerce of attribute coerce (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::type_constraint (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Mixin​::AttributeCore​::type_constraint (defined at C​:/p523/lib/parent.pm line 16)
_<reader Moose​::Meta​::Role​::Application​::RoleSummation​::role_params (defined at C​:/p523/site/lib/Moose.pm line 35)
_<reader Moose​::Meta​::Role​::Application​::RoleSummation​::role_params (defined at C​:/p523/site/lib/Moose.pm line 35)
_<reader Moose​::Meta​::Role​::Application​::ToClass​::role (defined at C​:/p523/site/lib/Moose.pm line 36)
_<reader Moose​::Meta​::Role​::Application​::ToClass​::role (defined at C​:/p523/site/lib/Moose.pm line 36)
_<reader Moose​::Meta​::Role​::Application​::ToInstance​::rebless_params (defined at C​:/p523/site/lib/Moose.pm line 38)
_<reader Moose​::Meta​::Role​::Application​::ToInstance​::rebless_params (defined at C​:/p523/site/lib/Moose.pm line 38)
_<reader Moose​::Meta​::Role​::Application​::get_method_aliases of attribute method_aliases (defined at C​:/p523/site/lib/Moose.pm line 34)
_<reader Moose​::Meta​::Role​::Application​::get_method_aliases of attribute method_aliases (defined at C​:/p523/site/lib/Moose.pm line 34)
_<reader Moose​::Meta​::Role​::Application​::get_method_exclusions of attribute method_exclusions (defined at C​:/p523/site/lib/Moose.pm line 34)
_<reader Moose​::Meta​::Role​::Application​::get_method_exclusions of attribute method_exclusions (defined at C​:/p523/site/lib/Moose.pm line 34)
_<reader Moose​::Meta​::Role​::Attribute​::_original_role (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::_original_role (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::associated_role (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::associated_role (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::is (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::is (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::metaclass (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::metaclass (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::original_options (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Attribute​::original_options (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
_<reader Moose​::Meta​::Role​::Composite​::_method_map of attribute _methods (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::_method_map of attribute _methods (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::_overload_map of attribute _overloads (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::_overload_map of attribute _overloads (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::application_role_summation_class (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::application_role_summation_class (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::name (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Composite​::name (defined at C​:/p523/site/lib/Moose.pm line 33)
_<reader Moose​::Meta​::Role​::Method​::Conflicting​::roles (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 14)
_<reader Moose​::Meta​::Role​::Method​::Conflicting​::roles (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 14)
_<reader Moose​::Meta​::Role​::Method​::Required​::name (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 13)
_<reader Moose​::Meta​::Role​::Method​::Required​::name (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 13)
_<reader Moose​::Meta​::Role​::application_to_class_class (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::application_to_class_class (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::application_to_instance_class (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::application_to_instance_class (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::application_to_role_class (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::application_to_role_class (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::applied_attribute_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::applied_attribute_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::conflicting_method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::conflicting_method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_after_method_modifiers_map of attribute after_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_after_method_modifiers_map of attribute after_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_around_method_modifiers_map of attribute around_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_around_method_modifiers_map of attribute around_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_before_method_modifiers_map of attribute before_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_before_method_modifiers_map of attribute before_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_excluded_roles_map of attribute excluded_roles_map (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_excluded_roles_map of attribute excluded_roles_map (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_override_method_modifiers_map of attribute override_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_override_method_modifiers_map of attribute override_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_required_methods_map of attribute required_methods (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_required_methods_map of attribute required_methods (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_roles of attribute roles (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::get_roles of attribute roles (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::required_method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::Role​::required_method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
_<reader Moose​::Meta​::TypeCoercion​::type_coercion_map (defined at C​:/p523/site/lib/Moose.pm line 26)
_<reader Moose​::Meta​::TypeCoercion​::type_coercion_map (defined at C​:/p523/site/lib/Moose.pm line 26)
_<reader Moose​::Meta​::TypeCoercion​::type_constraint (defined at C​:/p523/site/lib/Moose.pm line 26)
_<reader Moose​::Meta​::TypeCoercion​::type_constraint (defined at C​:/p523/site/lib/Moose.pm line 26)
_<reader Moose​::Meta​::TypeCoercion​::type_constraint (defined at C​:/p523/site/lib/Moose.pm line 26)
_<reader Moose​::Meta​::TypeConstraint​::Class​::class (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 28)
_<reader Moose​::Meta​::TypeConstraint​::Class​::class (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 28)
_<reader Moose​::Meta​::TypeConstraint​::Registry​::get_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<reader Moose​::Meta​::TypeConstraint​::Registry​::get_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<reader Moose​::Meta​::TypeConstraint​::Registry​::type_constraints (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<reader Moose​::Meta​::TypeConstraint​::Registry​::type_constraints (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<reader Moose​::Meta​::TypeConstraint​::Role​::role (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 29)
_<reader Moose​::Meta​::TypeConstraint​::Role​::role (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 29)
_<reader Moose​::Meta​::TypeConstraint​::constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<reader Moose​::Meta​::TypeConstraint​::constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<reader Moose​::Meta​::TypeConstraint​::name (defined at C​:/p523/site/lib/Moose.pm line 25)
_<reader Moose​::Meta​::TypeConstraint​::name (defined at C​:/p523/site/lib/Moose.pm line 25)
_<reader Moose​::Meta​::TypeConstraint​::parent (defined at C​:/p523/site/lib/Moose.pm line 25)
_<reader Moose​::Meta​::TypeConstraint​::parent (defined at C​:/p523/site/lib/Moose.pm line 25)
_<writer Moose​::Meta​::Mixin​::AttributeCore​::_set_handles of attribute handles (defined at C​:/p523/lib/parent.pm line 16)
_<writer Moose​::Meta​::Mixin​::AttributeCore​::_set_handles of attribute handles (defined at C​:/p523/lib/parent.pm line 16)
_<writer Moose​::Meta​::TypeConstraint​::Registry​::set_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<writer Moose​::Meta​::TypeConstraint​::Registry​::set_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
_<writer Moose​::Meta​::TypeConstraint​::_set_constraint of attribute constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
_<writer Moose​::Meta​::TypeConstraint​::_set_constraint of attribute constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::Class​::constructor_class (defined at C​:/p523/site/lib/Moose.pm line 24)
accessor Moose​::Meta​::Class​::destructor_class (defined at C​:/p523/site/lib/Moose.pm line 24)
accessor Moose​::Meta​::Class​::immutable_trait (defined at C​:/p523/site/lib/Moose.pm line 24)
accessor Moose​::Meta​::Role​::Application​::ToClass​::class (defined at C​:/p523/site/lib/Moose.pm line 36)
accessor Moose​::Meta​::Role​::Composite​::_overload_fallback (defined at C​:/p523/site/lib/Moose.pm line 33)
accessor Moose​::Meta​::TypeCoercion​::_compiled_type_coercion of attribute compiled_type_coercion (defined at C​:/p523/site/lib/Moose.pm line 26)
accessor Moose​::Meta​::TypeConstraint​::DuckType​::methods (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 31)
accessor Moose​::Meta​::TypeConstraint​::Enum​::_inline_var_name (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 30)
accessor Moose​::Meta​::TypeConstraint​::Enum​::values (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 30)
accessor Moose​::Meta​::TypeConstraint​::Parameterizable​::constraint_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
accessor Moose​::Meta​::TypeConstraint​::Parameterizable​::inline_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
accessor Moose​::Meta​::TypeConstraint​::Parameterized​::parameterized_from (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
accessor Moose​::Meta​::TypeConstraint​::Parameterized​::type_parameter (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
accessor Moose​::Meta​::TypeConstraint​::Union​::type_constraints (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::_compiled_type_constraint of attribute compiled_type_constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::_default_message (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::_inline_environment of attribute inline_environment (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::_package_defined_in of attribute package_defined_in (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::coercion (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::inlined (defined at C​:/p523/site/lib/Moose.pm line 25)
accessor Moose​::Meta​::TypeConstraint​::message (defined at C​:/p523/site/lib/Moose.pm line 25)
aints.pm line 34)"
ation_to_role_class'}ication​::get_method_exclusions of attribute method_exclusions (defined at C​:/p523/site/lib/Moose.pm line 34)"
b/Moose.pm line 243)"
cation_to_instance_class (defined at C​:/p523/site/lib/Moose.pm line 32)"
cation_to_role_class'}ication​::get_method_aliases of attribute method_aliases (defined at C​:/p523/site/lib/Moose.pm line 34)"
constructor Moose​::Meta​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Class​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Instance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Method​::Augmented​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Method​::Constructor​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Method​::Destructor​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Method​::Overridden​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Method​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Application​::RoleSummation​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Application​::ToClass​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Application​::ToInstance​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Application​::ToRole​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Application​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Composite​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Method​::Conflicting​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Method​::Required​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::Method​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::Role​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::TypeCoercion​::Union​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::TypeCoercion​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)
constructor Moose​::Meta​::TypeConstraint​::Class​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::DuckType​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::Enum​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::Parameterizable​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::Parameterized​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::Registry​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::Role​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::Union​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
constructor Moose​::Meta​::TypeConstraint​::_new (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 717)
defined at C​:/p523/lib/parent.pm line 16
defined at C​:/p523/lib/parent.pm line 16
e 1 "reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)"
int/Parameterized.pm line 10)
overload/numbers.pm
p.pm") =~ s!​::!/!g;
p523/lib/parent.pm lin_
plication​::ToClass​::class (defined at C​:/p523/site/lib/Moose.pm line 36)"
predicate Moose​::Meta​::Attribute​::has_applied_traits of attribute traits (defined at C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm line 8)
predicate Moose​::Meta​::Mixin​::AttributeCore​::has_documentation of attribute documentation (defined at C​:/p523/lib/parent.pm line 16)
predicate Moose​::Meta​::Mixin​::AttributeCore​::has_handles of attribute handles (defined at C​:/p523/lib/parent.pm line 16)
predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)
predicate Moose​::Meta​::Mixin​::AttributeCore​::has_trigger of attribute trigger (defined at C​:/p523/lib/parent.pm line 16)
predicate Moose​::Meta​::Mixin​::AttributeCore​::has_type_constraint of attribute type_constraint (defined at C​:/p523/lib/parent.pm line 16)
predicate Moose​::Meta​::TypeConstraint​::Parameterizable​::has_constraint_generator of attribute constraint_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
predicate Moose​::Meta​::TypeConstraint​::Parameterizable​::has_inline_generator of attribute inline_generator (defined at C​:/p523/site/lib/Moose/Meta/TypeConstraint/Parameterized.pm line 10)
predicate Moose​::Meta​::TypeConstraint​::Parameterized​::has_parameterized_from of attribute parameterized_from (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
predicate Moose​::Meta​::TypeConstraint​::Parameterized​::has_type_parameter of attribute type_parameter (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 26)
predicate Moose​::Meta​::TypeConstraint​::Registry​::has_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
predicate Moose​::Meta​::TypeConstraint​::_has_compiled_type_constraint of attribute compiled_type_constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
predicate Moose​::Meta​::TypeConstraint​::_has_inlined_type_constraint of attribute inlined (defined at C​:/p523/site/lib/Moose.pm line 25)
predicate Moose​::Meta​::TypeConstraint​::has_coercion of attribute coercion (defined at C​:/p523/site/lib/Moose.pm line 25)
predicate Moose​::Meta​::TypeConstraint​::has_message of attribute message (defined at C​:/p523/site/lib/Moose.pm line 25)
predicate Moose​::Meta​::TypeConstraint​::has_parent of attribute parent (defined at C​:/p523/site/lib/Moose.pm line 25)
reader Moose​::Meta​::Attribute​::applied_traits of attribute traits (defined at C​:/p523/site/lib/Moose/Meta/TypeCoercion.pm line 8)
reader Moose​::Meta​::Class​::_get_role_applications of attribute role_applications (defined at C​:/p523/site/lib/Moose.pm line 24)
reader Moose​::Meta​::Class​::roles (defined at C​:/p523/site/lib/Moose.pm line 24)
reader Moose​::Meta​::Mixin​::AttributeCore​::_does_metadata of attribute does (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::_is_metadata of attribute is (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::_isa_metadata of attribute isa (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::documentation (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::handles (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy of attribute lazy (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::is_lazy_build of attribute lazy_build (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::is_required of attribute required (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::is_weak_ref of attribute weak_ref (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::should_auto_deref of attribute auto_deref (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::should_coerce of attribute coerce (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::trigger (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Mixin​::AttributeCore​::type_constraint (defined at C​:/p523/lib/parent.pm line 16)
reader Moose​::Meta​::Role​::Application​::RoleSummation​::role_params (defined at C​:/p523/site/lib/Moose.pm line 35)
reader Moose​::Meta​::Role​::Application​::ToClass​::role (defined at C​:/p523/site/lib/Moose.pm line 36)
reader Moose​::Meta​::Role​::Application​::ToInstance​::rebless_params (defined at C​:/p523/site/lib/Moose.pm line 38)
reader Moose​::Meta​::Role​::Application​::get_method_aliases of attribute method_aliases (defined at C​:/p523/site/lib/Moose.pm line 34)
reader Moose​::Meta​::Role​::Application​::get_method_exclusions of attribute method_exclusions (defined at C​:/p523/site/lib/Moose.pm line 34)
reader Moose​::Meta​::Role​::Attribute​::_original_role (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
reader Moose​::Meta​::Role​::Attribute​::associated_role (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
reader Moose​::Meta​::Role​::Attribute​::is (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
reader Moose​::Meta​::Role​::Attribute​::metaclass (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
reader Moose​::Meta​::Role​::Attribute​::original_options (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 11)
reader Moose​::Meta​::Role​::Composite​::_method_map of attribute _methods (defined at C​:/p523/site/lib/Moose.pm line 33)
reader Moose​::Meta​::Role​::Composite​::_overload_map of attribute _overloads (defined at C​:/p523/site/lib/Moose.pm line 33)
reader Moose​::Meta​::Role​::Composite​::application_role_summation_class (defined at C​:/p523/site/lib/Moose.pm line 33)
reader Moose​::Meta​::Role​::Composite​::name (defined at C​:/p523/site/lib/Moose.pm line 33)
reader Moose​::Meta​::Role​::Method​::Conflicting​::roles (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 14)
reader Moose​::Meta​::Role​::Method​::Required​::name (defined at C​:/p523/site/lib/Moose/Meta/Role.pm line 13)
reader Moose​::Meta​::Role​::application_to_class_class (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::application_to_instance_class (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::application_to_role_class (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::applied_attribute_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::conflicting_method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_after_method_modifiers_map of attribute after_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_around_method_modifiers_map of attribute around_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_before_method_modifiers_map of attribute before_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_excluded_roles_map of attribute excluded_roles_map (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_override_method_modifiers_map of attribute override_method_modifiers (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_required_methods_map of attribute required_methods (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::get_roles of attribute roles (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::Role​::required_method_metaclass (defined at C​:/p523/site/lib/Moose.pm line 32)
reader Moose​::Meta​::TypeCoercion​::type_coercion_map (defined at C​:/p523/site/lib/Moose.pm line 26)
reader Moose​::Meta​::TypeCoercion​::type_constraint (defined at C​:/p523/site/lib/Moose.pm line 26)
reader Moose​::Meta​::TypeConstraint​::Class​::class (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 28)
reader Moose​::Meta​::TypeConstraint​::Registry​::get_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
reader Moose​::Meta​::TypeConstraint​::Registry​::type_constraints (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
reader Moose​::Meta​::TypeConstraint​::Role​::role (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 29)
reader Moose​::Meta​::TypeConstraint​::constraint (defined at C​:/p523/site/lib/Moose.pm line 25)
reader Moose​::Meta​::TypeConstraint​::name (defined at C​:/p523/site/lib/Moose.pm line 25)
reader Moose​::Meta​::TypeConstraint​::parent (defined at C​:/p523/site/lib/Moose.pm line 25)
ribute trigger (defined at C​:/p523/lib/parent.pm line 16)"
ructor Moose​::Meta​::Role​::Attribute​::_new (defined at C​:/p523/site/lib/Moose.pm line 243)"
straints.pm line 34)
t/Parameterized.pm line 10)"
traints.pm line 34)
warnings/register.pm
writer Moose​::Meta​::Mixin​::AttributeCore​::_set_handles of attribute handles (defined at C​:/p523/lib/parent.pm line 16)
writer Moose​::Meta​::TypeConstraint​::Registry​::set_parent_registry of attribute parent_registry (defined at C​:/p523/site/lib/Moose/Util/TypeConstraints.pm line 34)
writer Moose​::Meta​::TypeConstraint​::_set_constraint of attribute constraint (defined at C​:/p523/site/lib/Moose.pm line 25)

@p5pRT
Copy link
Author

p5pRT commented Mar 20, 2016

From @bulk88

On Fri Mar 11 20​:30​:24 2016, bulk88 wrote​:

It looks like there are 2-4 identical CHEKs ("_<" prefixed strings)
being created

Not a problem anymore. There are only 2 identical _< strings. One is the CHEK and the other is a SHEK in PL_strtab. I can separate them in a hex core dump by looking at HEK_FLAGS byte, 0x00 is SHEK, and 0x0C (I think) is a CHEK.

and 1 missed COW opportunity for each Eval​::Closure
sub. I will need to investigate this a bit more.

Fixed in commit "#line 1234 "bar_filename"'s dbging glob's scalar should be a CHEK COW SV".

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

p5pRT commented Mar 23, 2016

From @iabyn

On Wed, Mar 02, 2016 at 01​:35​:22PM -0800, bulk88 via RT wrote​:

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

Ok, I spent most of yesterday looking at the rt125296-wip-COPFILE-threads
branch, and I think I understand it a little better now.

My biggest problem with the way its currently implemented is that
SHEKs are embedded into SVs (using the same mechanism whereby HEKs are
likewise already embedded).

Perl's hash implementation is already notoriously complex, and I would
prefer for that complexity to not increase. I would like ideally for
this branch not not touch hv.h or hv.c at all. As it stands, a lot of
hot code (copying SVs, accessing hashes etc) all now have to know about
both HEKs and SHEKs, and do different things depending.

IIUC, most of the filename duplication was caused by copies of names being
stored in cop_file, xcv_file, gp_file_hek. I have no problem with these
all being shared as a single CHEK.

It's the stuff where "<_foo.pm" is stored as a GV and a GvSV in symbol
tables that I find problematic. I should point out right away that I don't
fully understand how that area of perl works, but I get the impression
it's mainly used by the debugger.

I would like (if its possible) for the GvSV be be created using *copy*
of the filename string, rather than pointing the SV's pv pointer at a
CHEK. I'm hoping that these GV/GvSV's don't get created very much,
and that they get automatically shared (within a single thread) by virtue
of being in a symbol table.

If we end up with two or three copies of a filename stored per compiled
file, then I think that's perfectly acceptable​: it was the hundreds or
thousands of copies being made (one per nextstate and sub etc) that was
the real problem.

If the same implementation can be used on both threaded and non-threaded
builds, where the non-threaded is at least no worse than before in terms of
performance and storage, then then I would be strongly in favour of using
the same implementation for both.

If CHEKs do end up only being used a refererence-counted shared
strings, then I would prefer that the string "HEK" is removed from their
name, as they wouldn't be part of the hash system, and the name would only
serve to confuse.

Also, I would prefer that struct fields like cop_file are declared as
type 'CHEK*' rather than 'char*' if possible, to make it more obvious
what is being stored there.

Finally, thanks for working on this, and I'm sorry that I disagree with
some of the implementation.

--
"Emacs isn't a bad OS once you get used to it.
It just lacks a decent editor."

@p5pRT
Copy link
Author

p5pRT commented Mar 23, 2016

From @bulk88

On Wed Mar 23 04​:01​:22 2016, davem wrote​:

On Wed, Mar 02, 2016 at 01​:35​:22PM -0800, bulk88 via RT wrote​:

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

Ok, I spent most of yesterday looking at the rt125296-wip-COPFILE-threads
branch, and I think I understand it a little better now.

My biggest problem with the way its currently implemented is that
SHEKs are embedded into SVs (using the same mechanism whereby HEKs are
likewise already embedded).

Perl's hash implementation is already notoriously complex, and I would
prefer for that complexity to not increase. I would like ideally for
this branch not not touch hv.h or hv.c at all. As it stands, a lot of
hot code (copying SVs, accessing hashes etc) all now have to know about
both HEKs and SHEKs, and do different things depending.

There is no way to introduce a new COW type into SVPVs. The SVPV head and body have no free bits/free permutations/storage to encode anything more. AFAIK

SVf_IsCOW && SvLEN == 0 = HEK
SVf_IsCOW && SvLEN != 0 = Perl COW string with refcount
!SVf_IsCOW && SvLEN == 0 = C static string

So using the HEK case is the only way to add a new COW type.

IIUC, most of the filename duplication was caused by copies of names being
stored in cop_file, xcv_file, gp_file_hek. I have no problem with these
all being shared as a single CHEK.

It's the stuff where "<_foo.pm" is stored as a GV and a GvSV in symbol
tables that I find problematic. I should point out right away that I don't
fully understand how that area of perl works, but I get the impression
it's mainly used by the debugger.

Right. I could try to "clean up" the perl debugger infrastructure and remove "unused" features but I didnt, because Im too afraid to do it due to a lack of familiarity and ability to unit/human test the perl debugging infrastructure after I change it.

I would like (if its possible) for the GvSV be be created using *copy*
of the filename string, rather than pointing the SV's pv pointer at a
CHEK. I'm hoping that these GV/GvSV's don't get created very much,
and that they get automatically shared (within a single thread) by virtue
of being in a symbol table.

That sounds inefficient memory usage wise. __FILE__ badly needs COW CHEKs. caller(), %INC values, and GvSV of the glob also benefit.

If we end up with two or three copies of a filename stored per compiled
file, then I think that's perfectly acceptable​:

With the CHEK design, there will be only 2 copies of the filepath per perl process, one a CHEK and one a SHEK in PL_strtab (the debug glob's HE in main​::).

it was the hundreds or
thousands of copies being made (one per nextstate and sub etc) that was
the real problem.

If the same implementation can be used on both threaded and non-threaded
builds, where the non-threaded is at least no worse than before in terms of
performance and storage, then then I would be strongly in favor of using
the same implementation for both.

commit "WIP CHEKs on unthreaded perl" does that, I need test unthreaded with CHEKs with -MMoose and IDK what else to try as a benchmark or measurement criteria. There are some provisions that if GCC/POSIX/Whatever atomic APIs are added to perl, some of the current mutexes would be replaces by atomic operations, and then CHEKs and SHEKs are absolutely identical in ++ and -- operations (always do the atomic CPU instruction whether the HEK * is from shared mem pool or per interp pool), only at freeing time does it make a difference which pool to return the ptr to.

If CHEKs do end up only being used a refererence-counted shared
strings, then I would prefer that the string "HEK" is removed from their
name, as they wouldn't be part of the hash system, and the name would only
serve to confuse.

I'd still keep the hash number stored in them with binary compatibility with a HEK * but it won't be obvious anymore (IDC, unless you are debugging the CHEK code, you wont know or care where that ptr came from, you just wanna know where perl crashed). Do you have a better name than "CHEK"? It needs to be kinda pronounceable if you say it on stage at a podium. I need the abbreviation and the full length expansion too obviously.

Also, I would prefer that struct fields like cop_file are declared as
type 'CHEK*' rather than 'char*' if possible, to make it more obvious
what is being stored there.

Are you sure you really want to see that as a perl C dev? Its more things to type or click everytime in a C debugger UI to "open" the struct pointer vs just reading the char []. Unthreaded builds require 3 extra clicks to figure out what the PP filename is (GV *) in a crashed/suspended perl proc (curcop), threaded builds are more convenient that its just a char * in the COP vs drilling through a GV head and into the GV body. I can change it so all the perl structs are declared with CHEK *s and not char *s if everyone else wants it that way.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

p5pRT commented Mar 23, 2016

From @timbunce

On Wed, Mar 23, 2016 at 09​:41​:10AM -0700, bulk88 via RT wrote​:

On Wed Mar 23 04​:01​:22 2016, davem wrote​:

I would like (if its possible) for the GvSV be be created using *copy*
of the filename string, rather than pointing the SV's pv pointer at a
CHEK. I'm hoping that these GV/GvSV's don't get created very much,
and that they get automatically shared (within a single thread) by virtue
of being in a symbol table.

That sounds inefficient memory usage wise. __FILE__ badly needs COW CHEKs. caller(), %INC values, and GvSV of the glob also benefit.

If we end up with two or three copies of a filename stored per compiled
file, then I think that's perfectly acceptable​:

With the CHEK design, there will be only 2 copies of the filepath per perl process, one a CHEK and one a SHEK in PL_strtab (the debug glob's HE in main​::).

it was the hundreds or thousands of copies being made (one per
nextstate and sub etc) that was the real problem.

FWIW, I'd be happy enough with reducing hundreds or thousands of copies
down to having just a few. Especially if that simplifies the internals.

Tim.

@p5pRT
Copy link
Author

p5pRT commented Mar 24, 2016

From @iabyn

On Wed, Mar 23, 2016 at 09​:41​:10AM -0700, bulk88 via RT wrote​:

On Wed Mar 23 04​:01​:22 2016, davem wrote​:

On Wed, Mar 02, 2016 at 01​:35​:22PM -0800, bulk88 via RT wrote​:

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

Ok, I spent most of yesterday looking at the rt125296-wip-COPFILE-threads
branch, and I think I understand it a little better now.

My biggest problem with the way its currently implemented is that
SHEKs are embedded into SVs (using the same mechanism whereby HEKs are
likewise already embedded).

Perl's hash implementation is already notoriously complex, and I would
prefer for that complexity to not increase. I would like ideally for
this branch not not touch hv.h or hv.c at all. As it stands, a lot of
hot code (copying SVs, accessing hashes etc) all now have to know about
both HEKs and SHEKs, and do different things depending.

There is no way to introduce a new COW type into SVPVs. The SVPV head and body have no free bits/free permutations/storage to encode anything more. AFAIK

SVf_IsCOW && SvLEN == 0 = HEK
SVf_IsCOW && SvLEN != 0 = Perl COW string with refcount
!SVf_IsCOW && SvLEN == 0 = C static string

So using the HEK case is the only way to add a new COW type.

I'm saying that (I think) there's no need to embed SHEKs into SVs​: copy
them instead. The proof-of-concept diff attached makes sv_sethek() and
newSVhek copy the string rather than embed a SHEK, and makes places like
sv_setsv_flags() assert that any embeeded HEKs aren't in fact SHEKs.

Running this code​:

  perl -MMath​::BigInt -e'dump'

and greppping for the string "lib/Math/BigInt.pm" in the core file, gives
these counts​:

  1532 blead
  1 your rt125296-wip-COPFILE-threads branch
  2 you branch with my POC path added

I think that counts as good enough, and avoids having to pollute all the
HV code.

I would like (if its possible) for the GvSV be be created using *copy*
of the filename string, rather than pointing the SV's pv pointer at a
CHEK. I'm hoping that these GV/GvSV's don't get created very much,
and that they get automatically shared (within a single thread) by virtue
of being in a symbol table.

That sounds inefficient memory usage wise. __FILE__ badly needs COW
CHEKs. caller(), %INC values, and GvSV of the glob also benefit.

Remember that compiling a source file creates thousands of OPs, SVs, GVs
etc. If a few extra (mostly temporary) copies of the filename get made
from time to time, that isn't really an issue.
Also, I'm assuming that once GV and GvSV have been created with the name
"<_lib/Foo/Bar.pm", that this will be re-used each time rather than more
GVs being created.

If CHEKs do end up only being used a refererence-counted shared
strings, then I would prefer that the string "HEK" is removed from their
name, as they wouldn't be part of the hash system, and the name would only
serve to confuse.

I'd still keep the hash number stored in them with binary compatibility
with a HEK * but it won't be obvious anymore (IDC, unless you are
debugging the CHEK code, you wont know or care where that ptr came from,
you just wanna know where perl crashed). Do you have a better name than
"CHEK"? It needs to be kinda pronounceable if you say it on stage at a
podium. I need the abbreviation and the full length expansion too
obviously.

Pronouncability isn't a major concern. I'd suggest perhaps.

  struct cop_filestr.

It's used so rarely that it probably doesn't even need a typedef.

If at some point in the future the need for a ref-counted shared string
becomes more general, we could rename it to something more generic
and typdef cop_filestr to it. But at the moment giving it a specfic name
makes it clear what its for.

 

Also, I would prefer that struct fields like cop_file are declared as
type 'CHEK*' rather than 'char*' if possible, to make it more obvious
what is being stored there.

Are you sure you really want to see that as a perl C dev? Its more things to type or click everytime in a C debugger UI to "open" the struct pointer vs just reading the char []. Unthreaded builds require 3 extra clicks to figure out what the PP filename is (GV *) in a crashed/suspended perl proc (curcop), threaded builds are more convenient that its just a char * in the COP vs drilling through a GV head and into the GV body. I can change it so all the perl structs are declared with CHEK *s and not char *s if everyone else wants it that way.

--
bulk88 ~ bulk88 at hotmail.com

---
via perlbug​: queue​: perl5 status​: open
https://rt-archive.perl.org/perl5/Ticket/Display.html?id=125296

--
Please note that ash-trays are provided for the use of smokers,
whereas the floor is provided for the use of all patrons.
  -- Bill Royston

@p5pRT
Copy link
Author

p5pRT commented Mar 24, 2016

From @iabyn

0001-sv_sethek-newSVhek-copy-rather-than-embed.patch
From e545037d18e839484d1f62b58e8fb71bef43d501 Mon Sep 17 00:00:00 2001
From: David Mitchell <davem@iabyn.com>
Date: Thu, 24 Mar 2016 09:11:23 +0000
Subject: [PATCH] sv_sethek,newSVhek copy rather than embed

---
 sv.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/sv.c b/sv.c
index f7c1495..a5f3f95 100644
--- a/sv.c
+++ b/sv.c
@@ -4715,6 +4715,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
 			HEK * hek = SvSHARED_HEK_FROM_PV(SvPVX_const(sstr));
 			U8 offset = (Size_t)SvPVX_const(sstr) & 0x3;
 			SvPV_set(dstr, HEK_KEY(hek)+offset);
+			assert(!(HEK_FLAGS(hek) & HVhek_COMPILING));
 			if(HEK_FLAGS(hek) & HVhek_COMPILING) {
 			    CHEK * chek = FNPV2CHEK(HEK2FNPV(hek));
 			    chek_inc(chek);
@@ -4837,6 +4838,7 @@ Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
 		{
 		    HEK * hek = SvSHARED_HEK_FROM_PV(SvPVX_const(sstr));
 		    U8 offset = (Size_t)SvPVX_const(sstr) & 0x3;
+                    assert(!(HEK_FLAGS(hek) & HVhek_COMPILING));
 		    if (HEK_FLAGS(hek) & HVhek_COMPILING) {
 			CHEK * chek = FNPV2CHEK(HEK2FNPV(hek));
 			chek_inc(chek);
@@ -5009,8 +5011,9 @@ Perl_sv_sethek(pTHX_ SV *const sv, const HEK *hek)
 	    sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
 	    SvUTF8_on(sv);
             return;
-	} else if ((flags & (HVhek_COMPILING | HVhek_UNSHARED)) == HVhek_UNSHARED) {
-	    sv_setpvn(sv, HEK_KEY(hek), HEK_LEN(hek));
+	} else if (flags & HVhek_UNSHARED) {
+            Size_t off = (flags & HVhek_COMPILING) ? 2 : 0; /* skip "_<" */
+	    sv_setpvn(sv, HEK_KEY(hek) + off, HEK_LEN(hek) - off);
 	    if (HEK_UTF8(hek))
 		SvUTF8_on(sv);
 	    else SvUTF8_off(sv);
@@ -5020,6 +5023,7 @@ Perl_sv_sethek(pTHX_ SV *const sv, const HEK *hek)
 	    SV_CHECK_THINKFIRST_COW_DROP(sv);
 	    SvUPGRADE(sv, SVt_PV);
 	    SvPV_free(sv);
+	    assert(!(flags & HVhek_COMPILING));
 	    if (flags & HVhek_COMPILING) {
 		CHEK * chek = FNPV2CHEK(HEK2FNPV(hek));
 		chek_inc(chek);
@@ -9319,12 +9323,13 @@ Perl_newSVhek(pTHX_ const HEK * hek)
 	    sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
 	    SvUTF8_on (sv);
 	    return sv;
-	} else if ((flags & (HVhek_COMPILING | HVhek_UNSHARED)) == HVhek_UNSHARED) {
+	} else if (flags & HVhek_UNSHARED) {
             /* A hash that isn't using shared hash keys has to have
 	       the flag in every key so that we know not to try to call
 	       share_hek_hek on it.  */
 
-	    SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
+            Size_t off = (flags & HVhek_COMPILING) ? 2 : 0; /* skip "_<" */
+	    SV * const sv = newSVpvn (HEK_KEY(hek) + off, HEK_LEN(hek) - off);
 	    if (HEK_UTF8(hek))
 		SvUTF8_on (sv);
 	    return sv;
@@ -9337,6 +9342,7 @@ Perl_newSVhek(pTHX_ const HEK * hek)
 
 	    new_SV(sv);
 	    sv_upgrade(sv, SVt_PV);
+	    assert(!(flags & HVhek_COMPILING));
 	    if (flags & HVhek_COMPILING) {
 		CHEK * chek = FNPV2CHEK(HEK2FNPV(hek));
 		chek_inc(chek);
-- 
2.4.3

@p5pRT
Copy link
Author

p5pRT commented Mar 27, 2016

From @bulk88

On Thu Mar 24 05​:07​:40 2016, davem wrote​:

I'm saying that (I think) there's no need to embed SHEKs into SVs​:
copy
them instead. The proof-of-concept diff attached makes sv_sethek()
and
newSVhek copy the string rather than embed a SHEK, and makes places
like
sv_setsv_flags() assert that any embeeded HEKs aren't in fact SHEKs.

Running this code​:

perl -MMath​::BigInt -e'dump'

and greppping for the string "lib/Math/BigInt.pm" in the core file,
gives
these counts​:

1532 blead
1 your rt125296-wip-COPFILE-threads branch
2 you branch with my POC path added

I think that counts as good enough, and avoids having to pollute all
the
HV code.

Your patch increased mem usage from 10848 KB to 10944 KB Win32 private bytes for "perl -MMoose -e"sleep 1000"". That is 96 KB more memory to load Moose. I disagree with it, the SHEK must be storable in a SV. 672 KB is "perl -e"sleep 1000"", so (10944-676)/(10848-676)=1.00943767204, you patch causes a 1% increase in memory usage of loading moose.

I would like (if its possible) for the GvSV be be created using
*copy*
of the filename string, rather than pointing the SV's pv pointer at
a
CHEK. I'm hoping that these GV/GvSV's don't get created very much,
and that they get automatically shared (within a single thread) by
virtue
of being in a symbol table.

That sounds inefficient memory usage wise. __FILE__ badly needs COW
CHEKs. caller(), %INC values, and GvSV of the glob also benefit.

Remember that compiling a source file creates thousands of OPs, SVs,
GVs
etc. If a few extra (mostly temporary) copies of the filename get made
from time to time, that isn't really an issue.

The copies are permanent. the SV behind __FILE__ token for example. Its 96 KB for Moose to have these extra copies in unique malloc storage.

Also, I'm assuming that once GV and GvSV have been created with the
name
"<_lib/Foo/Bar.pm", that this will be re-used each time rather than
more
GVs being created.

gv_fetchfile will fetch the same exact glob over and over. This design isn't changing.

If CHEKs do end up only being used a refererence-counted shared
strings, then I would prefer that the string "HEK" is removed from
their
name, as they wouldn't be part of the hash system, and the name
would only
serve to confuse.

I'd still keep the hash number stored in them with binary
compatibility
with a HEK * but it won't be obvious anymore (IDC, unless you are
debugging the CHEK code, you wont know or care where that ptr came
from,
you just wanna know where perl crashed). Do you have a better name
than
"CHEK"? It needs to be kinda pronounceable if you say it on stage at
a
podium. I need the abbreviation and the full length expansion too
obviously.

Pronouncability isn't a major concern. I'd suggest perhaps.

struct cop_filestr.

It's used so rarely that it probably doesn't even need a typedef.

I think it does CFSTR (sefster) Cop Filepath String, or COPSTR Cop String?

If at some point in the future the need for a ref-counted shared
string
becomes more general, we could rename it to something more generic
and typdef cop_filestr to it. But at the moment giving it a specfic
name
makes it clear what its for.

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT

This comment has been minimized.

@p5pRT
Copy link
Author

p5pRT commented Mar 28, 2016

From @iabyn

On Sun, Mar 27, 2016 at 10​:01​:03PM -0700, bulk88 via RT wrote​:

Your patch increased mem usage from 10848 KB to 10944 KB Win32 private
bytes for "perl -MMoose -e"sleep 1000"". That is 96 KB more memory to
load Moose. I disagree with it, the SHEK must be storable in a SV. 672
KB is "perl -e"sleep 1000"", so (10944-676)/(10848-676)=1.00943767204,
you patch causes a 1% increase in memory usage of loading moose.

The attached proof-of-concept patch (fails a couple tests) reduces
the 1% to 0.5%. With more work I think its likely more could be reduced.

It's used so rarely that it probably doesn't even need a typedef.

I think it does CFSTR (sefster) Cop Filepath String, or COPSTR Cop String?

I have no idea what any of that sentence means.

--
All wight. I will give you one more chance. This time, I want to hear
no Wubens. No Weginalds. No Wudolf the wed-nosed weindeers.
  -- Life of Brian

@p5pRT
Copy link
Author

p5pRT commented Mar 28, 2016

From @iabyn

0001-dedup-__FILE__.patch
From d6f66bc3abdca6902cefe1e3cb4877452754ef1e Mon Sep 17 00:00:00 2001
From: David Mitchell <davem@iabyn.com>
Date: Mon, 28 Mar 2016 17:33:15 +0100
Subject: [PATCH] dedup __FILE__

---
 toke.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/toke.c b/toke.c
index 9f78d5a..f81c51d 100644
--- a/toke.c
+++ b/toke.c
@@ -7206,9 +7206,12 @@ Perl_yylex(pTHX)
 	    }
 
 	case KEY___FILE__:
-	    FUN0OP(
-		(OP*)newSVOP(OP_CONST, 0, newSVhek((HEK*)((Size_t)FNPV2HEK(CopFILE(PL_curcop))+2)))
-	    );
+            {
+                GV *gv = gv_fetchfile_hek((HEK*)FNPV2HEK(CopFILE(PL_curcop)));
+                SV *sv = GvSV(gv);
+                OP *o = (OP*)newSVOP(OP_CONST, 0, SvREFCNT_inc_simple_NN(sv));
+                FUN0OP(o);
+            }
 
 	case KEY___LINE__:
 	    FUN0OP(
-- 
2.4.3

@p5pRT
Copy link
Author

p5pRT commented Mar 31, 2016

From mcarey@ucar.edu

On Mon, Mar 28, 2016 at 10​:42 AM, Dave Mitchell <davem@​iabyn.com> wrote​:

It's used so rarely that it probably doesn't even need a typedef.

I think it does CFSTR (sefster) Cop Filepath String, or COPSTR Cop
String?

I have no idea what any of that sentence means.

Attempted translation​: I think it does need a typedef, e.g.

  CFSTR (pronounced "sefster"), stands for "Cop Filepath String"

or

  COPSTR, stands for "Cop String"

@toddr
Copy link
Member

toddr commented Feb 13, 2020

@bulk88 @iabyn None of this seems to have made it into blead. Are we continuing to pursue this?

@bulk88
Copy link
Contributor

bulk88 commented Feb 16, 2020

Dave Mitchell disagrees with the new COW type being storable inside SVs because "I dont want to see HV code changed (because bulk88's primarily filename COW type is a derivative of a shared hash key infrastructure) because dont fully understand it myself and Ill understand it even less if there are modifications to it". Dave wants, if I understand correct, that the filename buffers, if they are exposed in PP, they will be copied into new SV * as 1 off malloc buffers, rather than any attempt at COW or many SV*s and many not PP exposed structs hold refcnt ownership on the same unique filename malloc buffer. My argument is basing the COWed filename strings off SVs directly is impossible because SVs can't encode any more COW or non-1 to 1 malloced string buffers. I decided on some of the struct names but I am bad at naming structs and wanted someone to agree or disagree on my suggested struct names. Since nobody but me and Dave ever read this ticket, or understands perl guts to comment on it, it stalled. I should finish it one day, its is the fastest to implement and largest memory win in the interp I can think of off the top of my head, other than dropping a member from a core high frequency used struct (automatic 4/8/16 byte win). I stopped working on it, because I didn't understand myself the impact the patch would have on B::CC and cperl and a thought I had for a long time of writing out CV optrees to memory mapped files (B::CC is really badly designed, it generates C files which must be compiled with a platform specific CC, rather than dumping optree linked lists straight to disk with a pointer relocation list) and I didn't understand myself if the SHEK/CHEK struct format can be stored in RO memory or not. AFAIK any attempts to memory map file PP subs/optrees to disk files would require non random hash seeds for largest shared between perl procs memory win. Otherwise all the hash es stored on disk have to have new hash keys written into HEKs and linked lists and HV arrays reoraganized on "serialized module load" into a perl proc.

@toddr
Copy link
Member

toddr commented Feb 16, 2020

Much of what you describe related to serialization is already available via cPanel’s B::C https://github.com/cpanel/perl-compiler. It is not currently available on CPAN primarily because it requires an unthreaded perl with several patches to Perl related to memory. Both of these can be overcome if there is interest from someone besides cPanel.

At this point we have made the strings for sheks static but all hash arrays have to be allocated and initialized on startup in order for hash randomization to work correctly.

Our conclusion at this point is that B::CC will never be achievable without essentially re-implementing libperl. What would be more useful is if a module at CHECK did peephole-ish optimizations to the op tree before it was handed to B::C. It could take as long as it likes since the code is serialized for rapid re-run later. This would also be super useful for daemonized processes like catalyst, dancer, mojo, etc. who don’t care (within reason) how slow a process is to compile.

We are available on IRC if you would like to learn more about what has already been done for B::C

@toddr toddr added this to Monitoring in toddr Feb 16, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
toddr
  
Monitoring
Development

No branches or pull requests

4 participants