Open p5pRT opened 9 years ago
This ticket is related to https://rt.perl.org/Public/Bug/Display.html?id=125296
perldebguts says
--------------------------------------------------- =item *
Each scalar C\<${"_\<$filename"}> contains C\<"_\<$filename">. This is
also the case for evaluated strings that contain subroutines\, or
which are currently being executed. The $filename for C\
This is not true.
--------------------------------------------------- BEGIN {$^P |=2;} use warnings; use Data::Dumper; use Devel::Peek 'Dump'; $Data::Dumper::Sortkeys = 1;
print Dumper(${'::_\<Peek.c'}); print Dumper(${'::_\<C:/perl521/srcnewb4opt/lib/Data/Dumper.pm'}); eval q| print Dumper(${'::_\<(eval 3)'});|; --------------------------------------------------- $VAR1 = 'Peek.c'; $VAR1 = 'C:/perl521/srcnewb4opt/lib/Data/Dumper.pm'; $VAR1 = '(eval 3)'; ---------------------------------------------------
That perldebguts item came from commit http://perl5.git.perl.org/perl.git/commitdiff/36477c247f3c188fb8cc7e276c87b739d3e6ab7c "[inseparable changes from patch from perl5.003_10 to perl5.003_11]" and specifically "10+ debugger patch" . I think that POD was based off a comment in http://perl5.git.perl.org/perl.git/commitdiff/55497cffdd24c959994f9a8ddd56db8ce85e1c5b "[inseparable changes from patch from perl5.003_07 to perl5.003_08]" specifically "Major '..' and debugger patches".
The actual C code that determines {SCALAR} contains a normal path and not a "_\<" path came from day 1 of gv_fetchfile in "perl 5.0 alpha 2" http://perl5.git.perl.org/perl.git/commitdiff/79072805bf63abe5b5978b5928ab00d360ea3e7f which came from a function called fstab which is a near clone of gv_fetchfile. fstab came from "perl 3.0 patch #34 patch #29\, continued" http://perl5.git.perl.org/perl.git/commitdiff/0a12ae7dee71b6eb0609c35185096ab75c95b2da . fstab was first used 1 commit ahead in at http://perl5.git.perl.org/perl.git/commitdiff/395c379347344a50494d2458b3a5e38ebdeac851 .
Most shocking is changing gv_fetchfile to store the "_\<" path in SCALAR\, does not cause any tests to fail on a harness run.
------------------------BEFORE---------------------------------- GV * Perl_gv_fetchfile_flags(pTHX_ const char *const name\, const STRLEN namelen\, const U32 flags) { char smallbuf[128]; char *tmpbuf; const STRLEN tmplen = namelen + 2; GV *gv;
PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS; PERL_UNUSED_ARG(flags);
if (!PL_defstash) return NULL;
if (tmplen \<= sizeof smallbuf) tmpbuf = smallbuf; else Newx(tmpbuf\, tmplen\, char); /* This is where the debugger's %{"::_\<$filename"} hash is created */ tmpbuf[0] = '_'; tmpbuf[1] = '\<'; memcpy(tmpbuf + 2\, name\, namelen); gv = *(GV**)hv_fetch(PL_defstash\, tmpbuf\, tmplen\, TRUE); if (!isGV(gv)) { gv_init(gv\, PL_defstash\, tmpbuf\, tmplen\, FALSE); #ifdef PERL_DONT_CREATE_GVSV GvSV(gv) = newSVpvn(name\, namelen); #else sv_setpvn(GvSV(gv)\, name\, namelen); #endif
------------------------AFTER---------------------------------- GV * Perl_gv_fetchfile_flags(pTHX_ const char *const name\, const STRLEN namelen\, const U32 flags) { char smallbuf[128]; char *tmpbuf; const STRLEN tmplen = namelen + 2; GV *gv;
PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS; PERL_UNUSED_ARG(flags);
if (!PL_defstash) return NULL;
if (tmplen \<= sizeof smallbuf) tmpbuf = smallbuf; else Newx(tmpbuf\, tmplen\, char); /* This is where the debugger's %{"::_\<$filename"} hash is created */ tmpbuf[0] = '_'; tmpbuf[1] = '\<'; memcpy(tmpbuf + 2\, name\, namelen); gv = *(GV**)hv_fetch(PL_defstash\, tmpbuf\, tmplen\, TRUE); if (!isGV(gv)) { gv_init(gv\, PL_defstash\, tmpbuf\, tmplen\, FALSE); #ifdef PERL_DONT_CREATE_GVSV GvSV(gv) = newSVpvn(tmpbuf\, tmplen); #else sv_setpvn(GvSV(gv)\, tmpbuf\, tmplen); #endif } ----------------------------------------------------------
So it seems either the SCALAR part of the "_\<" glob is unused by core (maybe it should be deleted to save memory leaving only the hash and array parts of the "_\<" glob?)\, or is never used during a harness run (perl5db.pl has no tests).
So my question is\, fix the POD to match the code\, or fix the code to match the POD\, or delete the code/feature entirely since its been unused for 22 years?
* bulk88 \perlbug\-followup@​perl\.org [2015-06-26T18:40:56]
So it seems either the SCALAR part of the "_\<" glob is unused by core (maybe it should be deleted to save memory leaving only the hash and array parts of the "_\<" glob?)\, or is never used during a harness run (perl5db.pl has no tests).
Shooting from the hip: fix the docs to match the code. The current behavior seems more useful.
Oh\, and add a test. :-)
-- rjbs
The RT System itself - Status changed from 'new' to 'open'
Migrated from rt.perl.org#125492 (status was 'open')
Searchable as RT125492$