Skip Menu |
Report information
Id: 74290
Status: resolved
Worked: 1 hour (60 min)
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: sprout <sprout [at] cpan.org>
Cc:
AdminCc:

Operating System: (no value)
PatchStatus: HasPatch
Severity: low
Type:
  • core
  • lexical/scope/closure
  • Patch
Perl Version: 5.10.0
Fixed In: (no value)



CC: jesse+cpan [...] fsck.com
Subject: [PATCH] Regression in 5.12: labelled string eval
Date: Sun, 11 Apr 2010 17:03:03 -0700
To: perlbug [...] perl.org
From: Father Chrysostomos <sprout [...] cpan.org>
Download (untitled) / with headers
text/plain 3.8k
http://www.nntp.perl.org/group/perl.perl5.porters/2010/04/msg158760.html This was broken by change 33656 (http://perl5.git.perl.org/perl.git/commitdiff/dca6062a863d0 ) moves labels to the hints hash. Here’s another example of the same bug, which shows that that it has nothing to do with $_: perl5.12.0 -le 'F1:++$x and eval q"print qq/x is $x/; exit if ++$y == 10; goto q/F1/;"' x is 1 x is 1 x is 1 x is 1 x is 1 x is 1 x is 1 x is 1 x is 1 x is 1 In short, Foo: eval "goto Foo" doesn’t go to Foo, but simply repeats the eval. I tried making S_dofindlabel skip any op that == PL_eval_start, but that prevents eval "Foo: print q/foo/; goto Foo" from working. In other words, the goto inside the eval cannot tell the difference between Foo: eval " ... " and eval "Foo: ... " It seems to have something to do with %^H not being synchronised with the equivalent internal structure, because putting BEGIN{ delete $^H {anything} } at the beginning of the evalled code fixes it. The attached patch is perhaps not the best fix, but works around the bug in a way that can’t cause any negative side-effects. Use of uninitialized value $category in concatenation (.) or string at /usr/local/bin/perlbug5.12.0 line 645. Use of uninitialized value $severity in concatenation (.) or string at /usr/local/bin/perlbug5.12.0 line 645. --- Flags: category=core severity=medium --- Site configuration information for perl 5.12.0: Configured by sprout at Tue Apr 6 15:41:56 PDT 2010. Summary of my perl5 (revision 5 version 12 subversion 0 patch v5.12.0- RC3-6-g8c57606) configuration: Snapshot of: 431be7b35e7448c1ced59444d6bdcfa11c5f83c7 Platform: osname=darwin, osvers=10.0.0, archname=darwin-2level uname='darwin pint.local 10.0.0 darwin kernel version 10.0.0: fri jul 31 22:47:34 pdt 2009; root:xnu-1456.1.25~1release_i386 i386 ' config_args='-de -Dusedevel' hint=recommended, useposix=true, d_sigaction=define useithreads=undef, usemultiplicity=undef useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef use64bitint=undef, use64bitall=undef, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-fno-common -DPERL_DARWIN -no-cpp-precomp -fno- strict-aliasing -pipe -fstack-protector -I/usr/local/include', optimize='-O3', cppflags='-no-cpp-precomp -fno-common -DPERL_DARWIN -no-cpp- precomp -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/ include' ccversion='', gccversion='4.2.1 (Apple Inc. build 5646)', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='env MACOSX_DEPLOYMENT_TARGET=10.3 cc', ldflags =' -fstack- protector -L/usr/local/lib' libpth=/usr/local/lib /usr/lib libs=-ldbm -ldl -lm -lutil -lc perllibs=-ldl -lm -lutil -lc libc=/usr/lib/libc.dylib, so=dylib, useshrplib=false, libperl=libperl.a gnulibc_version='' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' ' cccdlflags=' ', lddlflags=' -bundle -undefined dynamic_lookup -L/ usr/local/lib -fstack-protector' Locally applied patches: RC5 --- @INC for perl 5.12.0: /usr/local/lib/perl5/site_perl/5.12.0/darwin-2level /usr/local/lib/perl5/site_perl/5.12.0 /usr/local/lib/perl5/5.12.0/darwin-2level /usr/local/lib/perl5/5.12.0 /usr/local/lib/perl5/site_perl . --- Environment for perl 5.12.0: DYLD_LIBRARY_PATH (unset) HOME=/Users/sprout LANG=en_US.UTF-8 LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/ usr/local/bin PERL_BADLANG (unset) SHELL=/bin/bash
Download open_xnwzPlWi.txt
text/plain 1.1k

Message body is not shown because sender requested not to inline it.

Subject: Re: [perl #74290] [PATCH] Regression in 5.12: labelled string eval
Date: Tue, 13 Apr 2010 11:31:51 +0100
To: perl5-porters [...] perl.org
From: Nicholas Clark <nick [...] ccl4.org>
Download (untitled) / with headers
text/plain 1.1k
On Sun, Apr 11, 2010 at 05:03:41PM -0700, Father Chrysostomos wrote: Show quoted text
> diff -Nurp blead/pp_ctl.c blead-labelled-eval/pp_ctl.c > --- blead/pp_ctl.c 2010-04-10 14:03:15.000000000 -0700 > +++ blead-labelled-eval/pp_ctl.c 2010-04-11 14:27:16.000000000 -0700 > @@ -3763,6 +3763,8 @@ PP(pp_entereval) > HINTS_REFCNT_LOCK; > PL_compiling.cop_hints_hash->refcounted_he_refcnt++; > HINTS_REFCNT_UNLOCK; > + PL_compiling.cop_hints_hash > + = Perl_store_cop_label(aTHX_ PL_compiling.cop_hints_hash, ""); > } > /* special case: an eval '' executed within the DB package gets lexically > * placed in the first non-DB CV rather than the current CV - this
As is, that's going to leak, as the reference to the (then current) PL_compiling.cop_hints_hash is going to be bumped once by PL_compiling.cop_hints_hash->refcounted_he_refcnt++ and then bumped again within Perl_store_cop_label(). The simplest solution would be to remove the preceding 3 lines. A more efficient solution (avoiding any allocation) would be to walk back to the parent if the topmost item on PL_compiling.cop_hints_hash is a "label". Nicholas Clark
Subject: Re: [perl #74290] [PATCH] Regression in 5.12: labelled string eval
Date: Sat, 17 Apr 2010 20:16:03 +0100
To: perl5-porters [...] perl.org
From: Nicholas Clark <nick [...] ccl4.org>
Download (untitled) / with headers
text/plain 1.4k
On Tue, Apr 13, 2010 at 11:31:51AM +0100, Nicholas Clark wrote: Show quoted text
> On Sun, Apr 11, 2010 at 05:03:41PM -0700, Father Chrysostomos wrote: > >
> > diff -Nurp blead/pp_ctl.c blead-labelled-eval/pp_ctl.c > > --- blead/pp_ctl.c 2010-04-10 14:03:15.000000000 -0700 > > +++ blead-labelled-eval/pp_ctl.c 2010-04-11 14:27:16.000000000 -0700 > > @@ -3763,6 +3763,8 @@ PP(pp_entereval) > > HINTS_REFCNT_LOCK; > > PL_compiling.cop_hints_hash->refcounted_he_refcnt++; > > HINTS_REFCNT_UNLOCK; > > + PL_compiling.cop_hints_hash > > + = Perl_store_cop_label(aTHX_ PL_compiling.cop_hints_hash, ""); > > } > > /* special case: an eval '' executed within the DB package gets lexically > > * placed in the first non-DB CV rather than the current CV - this
> > As is, that's going to leak, as the reference to the (then current) > PL_compiling.cop_hints_hash is going to be bumped once by > PL_compiling.cop_hints_hash->refcounted_he_refcnt++ and then bumped again > within Perl_store_cop_label(). > > The simplest solution would be to remove the preceding 3 lines.
I'm wrong. Your patch as is is correct. Thanks for correctly identifying a solution, and for the simpler test code. Show quoted text
> A more efficient solution (avoiding any allocation) would be to walk back > to the parent if the topmost item on PL_compiling.cop_hints_hash is a "label".
However, I preferred this approach, and implemented it as 47550813adf9ff40. Nicholas Clark


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org