Open p5pRT opened 9 years ago
commit a636914a235cd8650ed6efcb07e302c0332fa638 "Re: CvFILE corruption under ithreads" from 5.7.1 from 2001 drastically increased memory usage of threaded perl.
Using "perl -e"system pause; require Test::More; system 'pause'"" as a benchmark\, and procdump\, strings @8 chars\, diff\, then manually removing sensitive information (user32/gdi32 shared memory with passwords from long gone GUI apps) produced the 2 logs (attached later in this ticket). You can see that each PP sub creates a unique copy of the absolute file path. ----------------------------------------------------------------- 05/28/2015 05:21 PM 11\,819\,415 perl.exe_nothd_af.dmp 05/28/2015 05:21 PM 10\,832\,263 perl.exe_nothd_b4.dmp 05/28/2015 05:35 PM 12\,069\,271 perl.exe_thd_af.dmp 05/28/2015 05:34 PM 10\,910\,087 perl.exe_thd_b4.dmp -----------------------------------------------------------------
unthreaded took 11\,819\,415-10\,832\,263=987\,152 bytes of memory. threaded took 12\,069\,271-10\,910\,087=1\,159\,184 bytes of memory
1\,159\,184-987\,152=172\,032 bytes of memory.
So threaded takes 172KB or 17% more memory to load the same Perl module.
Some more processing of the diff shows 1503 instances of new "+C:/"
paths\, it comes to 63988 bytes of extra file paths\, (attached later).
This file excludes alignment roundup+libc malloc headers+perl malloc
headers. 63988-(1503*1)\
Reverting ("#define CvFILE_set_from_cop(sv\, cop) (CvFILE(sv) = CopFILE(cop)\, CvDYNFILE_off(sv))") commit a636914a235cd8650ed6efcb07e302c0332fa638 "Re: CvFILE corruption under ithreads" causes causes mem corruption (use after free) and some test fails (I am using PERL_POISON+Win32 Debugging Heap (gflags) on the whole smoke). Here is the test fails. More tests fail individually when I run them with Dr Memory.
----------------------------------------------------------------- Test Summary Report ------------------- op/stash.t (Wstat: 0 Tests: 51 Failed: 1) Failed test: 35 uni/stash.t (Wstat: 0 Tests: 49 Failed: 1) Failed test: 36 ../ext/Devel-Peek/t/Peek.t (Wstat: 768 Test s: 114 Failed: 3) Failed tests: 25\, 27\, 51 Non-zero exit status: 3 Files=2385\, Tests=697642\, 5307 wallclock secs (257.47 usr + 7.23 sys = 264.70 C PU) Result: FAIL b88dmake: Error code 181\, while making 'test' -----------------------------------------------------------------
Dr Memory on op/stash.t shows failures like
-----------------------------------------------------------------
Error #1: UNADDRESSABLE ACCESS: reading 0x1161539c-0x1161539d 1 byte(s)
# 0 replace_strlen
[d:\drmemory_package\drmemory\replace.c:375]
# 1 perl522.dll!Perl_newSVpv [c:\perl521\srcnewb4opt\sv.c:9215]
# 2 B.dll!XS_B__IV_IVX [c:\perl521\srcnewb4opt\ext\b\b.xs:1676]
# 3 perl522.dll!Perl_pp_entersub [c:\perl521\srcnewb4opt\pp_hot.c:3268]
# 4 perl522.dll!Perl_runops_debug [c:\perl521\srcnewb4opt\dump.c:2234]
# 5 perl522.dll!S_run_body
[c:\perl521\srcnewb4opt\win32\perl.c:2451]
# 6 perl522.dll!perl_run
[c:\perl521\srcnewb4opt\win32\perl.c:2374]
# 7 perl522.dll!RunPerl
[c:\perl521\srcnewb4opt\win32\perllib.c:258]
# 8 main
[c:\perl521\srcnewb4opt\win32\perlmain.c:39]
-----------------------------------------------------------------
CvFILE is either a pointer to malloc freed sentinel pattern\, or some other perl src code file in the .t process and therefore the tests fail.
CvFILE always comes from CopFILE()\, but CopFILE() is very different on threads and unthreaded because of the "no SV*s in OPs due to shared OP/OP COW" limitation.
threaded
-----------------------------------------------------------------
# define CopFILE(c) ((c)->cop_file)
-----------------------------------------------------------------
unthreaded
-----------------------------------------------------------------
# define CopFILE(c) (CopFILEGV(c) \
? GvNAME(CopFILEGV(c))+2 : NULL)
-----------------------------------------------------------------
a section of the COP struct
-----------------------------------------------------------------
#ifdef USE_ITHREADS
PADOFFSET cop_stashoff; /* offset into PL_stashpad\, for the
package the line was compiled in */
char * cop_file; /* file name the following line # is from */
#else
HV * cop_stash; /* package line was compiled in */
GV * cop_filegv; /* file the following line # is from */
#endif
-----------------------------------------------------------------
The current design of CvFILE on threads has to change. I am currrently
experimenting with only selectivly using "savepv(CopFILE(cop))\,
CvDYNFILE_on(sv))". It seems to me (and Im not a optree expert) 99% of
the time\, the filename is available in the 1st op of the sub\, which is a
pp_nextstate. Predeclared subs have CV*s\, but CvSTART and CvROOT are
null\, so in Perl_newSTUB a savepv() is required. The PL_curcop filename
is freed on savestack with
-----------------------------------------------------------------
Note: # 0 replace_free
[d:\drmemory_package\common\alloc_replace.c:2380]
Note: # 1 perl522.dll!VMem::Free
[c:\perl521\srcnewb4opt\win32\vmem.h:213]
Note: # 2 perl522.dll!CPerlHost::FreeShared
[c:\perl521\srcnewb4opt\win32\perlhost.h:101]
Note: # 3 perl522.dll!PerlMemSharedFree
[c:\perl521\srcnewb4opt\win32\perlhost.h:360]
Note: # 4 perl522.dll!Perl_leave_scope
[c:\perl521\srcnewb4opt\scope.c:852]
Note: # 5 perl522.dll!Perl_pop_scope
[c:\perl521\srcnewb4opt\scope.c:104]
Note: # 6 perl522.dll!Perl_pp_leaveeval
[c:\perl521\srcnewb4opt\pp_ctl.c:4368]
Note: # 7 perl522.dll!Perl_runops_debug
[c:\perl521\srcnewb4opt\dump.c:2234]
Note: # 8 perl522.dll!S_run_body
[c:\perl521\srcnewb4opt\win32\perl.c:2451]
Note: # 9 perl522.dll!perl_run
[c:\perl521\srcnewb4opt\win32\perl.c:2374]
Note: #10 perl522.dll!RunPerl
[c:\perl521\srcnewb4opt\win32\perllib.c:258]
Note: #11 main
[c:\perl521\srcnewb4opt\win32\perlmain.c:39]
-----------------------------------------------------------------
callstack.
Another idea proposed in http://www.nntp.perl.org/group/perl.perl5.porters/2001/05/msg36781.html was to eliminate CvFILE entirely since its value is not used by PP code. There will be breakage on CPAN to remove CvFILE http://grep. cpan. me/?q=CvFILE but all the CvFILE uses are either to print debugging info to a human\, or setting CvFILE to maintain perlapi compatibility since core does that. This would save a ptr slot in the CV body plus the malloc. Here are the usages that look most\, "interesting" to me.
https://metacpan.org/source/MLEHMANN/Devel-FindRef-1.44/FindRef.xs#L204 https://metacpan.org/source/NWCLARK/Devel-Arena-0.23/Arena.xs#L453 https://metacpan.org/source/RGARCIA/Sub-Identify-0.10/Identify.xs#L49
Another idea is\, change CvFILE slot in the CV body to be HEK * owned or GV * (gv_fetchfile's GV*) un/owned by the CV * instead of the current unowned static char * for XS\, or the malloced char * for PP.
That also brings up\, why does gv_fetchfile exist to create typeglobs like this hand trimmed of non "_\<" entries list? What use do these GVs have? ----------------------------------------------------------------- C:\Documents and Settings\Owner>perl -e"$\,=\"\n\"\, print keys%main::" _\<perl.c _\<.\win32.c _\<..\universal.c _\<-e _\<perllib.c _\<..\perlio.c _\<..\mro_core.c _\<Win32CORE.c C:\Documents and Settings\Owner> -----------------------------------------------------------------
Or ----------------------------------------------------------------- C:\Documents and Settings\Owner>perl -e"require Test::Harness; $\,=\"\n\"\, print keys%main::" _\<C:/perl521/lib/strict.pm _\<C:/perl521/lib/auto/Time/HiRes/HiRes.dll _\<C:/perl521/lib/auto/Fcntl/Fcntl.dll _\<..\universal.c _\<C:/perl521/lib/XSLoader.pm _\<C:/perl521/lib/auto/IO/IO.dll _\<Cwd.c _\<-e _\<C:/perl521/lib/base.pm _\<C:/perl521/lib/auto/POSIX/POSIX.dll _\<Win32CORE.c _\<POSIX.xs _\<perllib.c _\<C:/perl521/lib/warnings.pm _\<C:/perl521/lib/Carp.pm _\<C:/perl521/lib/auto/Cwd/Cwd.dll _\<C:/perl521/site/lib/TAP/Parser/IteratorFactory.pm _\<..\mro_core.c _\<.\win32.c _\<DynaLoader.c _\<HiRes.c _\<perl.c _\<POSIX.c _\<Fcntl.c _\<IO.c _\<..\perlio.c C:\Documents and Settings\Owner> -----------------------------------------------------------------
Even worse\, these GVs have a SV * inside\, with YET another unique copy of the filename (see later attached pic\, gp_file_hek is the 1st copy\, the SV * in the GV* is another copy\, different pointers). ----------------------------------------------------------------- C:\Documents and Settings\Owner>perl -e"require Test::Harness; require Devel::Pe ek; Devel::Peek::Dump(*{'_\<C:/perl521/lib/strict.pm'})" SV = PVGV(0x90032c) at 0x9119f4 REFCNT = 1 FLAGS = (MULTI) NAME = "_\<C:/perl521/lib/strict.pm" NAMELEN = 26 GvSTASH = 0x3680f4 "main" FLAGS = 0x2 GP = 0x914f7c SV = 0x911a04 REFCNT = 1 IO = 0x0 FORM = 0x0 AV = 0x0 HV = 0x0 CV = 0x0 CVGEN = 0x0 GPFLAGS = 0x0 () LINE = 14 FILE = "C:/perl521/lib/strict.pm" EGV = 0x9119f4 "_\<C:/perl521/lib/strict.pm"
C:\Documents and Settings\Owner>perl -e"require Test::Harness; require Devel::Pe ek; Devel::Peek::Dump(*{'_\<C:/perl521/lib/strict.pm'}{SCALAR})" SV = IV(0x3681f8) at 0x3681fc REFCNT = 1 FLAGS = (TEMP\,ROK) RV = 0x911d3c SV = PV(0x36906c) at 0x911d3c REFCNT = 2 FLAGS = (POK\,pPOK) PV = 0x91527c "C:/perl521/lib/strict.pm"\0 CUR = 24 LEN = 26
C:\Documents and Settings\Owner> ----------------------------------------------------------------- While threaded perl wastes memory much worse than unthreaded. Unthreaded still has 3 copies of the file path for every .pm file in memory (see later attached). I guess I'll have to newSVpvn_share that\, or something else\, since I do have a HEK* already from the GV\, which is an easy fix.
Now note\, I have not said there are any memory leaks\, it is just that threaded Perl burns memory like an oil tycoon setting pallets of money on fire. All this code (file path storage) could only have been designed by a monkey house and has to change\, to something else. Exactly what\, is why I filed this ticket.
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
+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
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
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
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​::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.
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
The RT System itself - Status changed from 'new' to 'open'
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
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
Father C reported the same issue in https://rt.perl.org/Public/Bug/Display.html?id=117855
-- bulk88 ~ bulk88 at hotmail.com
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
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.
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
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
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
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)
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
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
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
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
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
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).
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
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
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"?!
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
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
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.
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
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: 304db021a9c708e406a62ccef48adf6103d73672\, 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
-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)
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
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."
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
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.
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
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
Seems to have never made it to the ML so reposting.
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
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
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"
Migrated from rt.perl.org#125296 (status was 'open')
Searchable as RT125296$