Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.94k stars 554 forks source link

nested closure doesn't capture #8964

Closed p5pRT closed 16 years ago

p5pRT commented 17 years ago

Migrated from rt.perl.org#43667 (status was 'resolved')

Searchable as RT43667$

p5pRT commented 17 years ago

From sthalik@tehran.lain.pl

Created by sthalik@tehran.lain.pl

% perl -le '{ my $foo = 42; sub foo { sub { $foo } } } print foo->() + 0' 0

I expect the inner sub to use the current value of $foo. It's not being captured\, though.

Perl Info ``` Flags: category=core severity=medium Site configuration information for perl v5.8.8: Configured by Debian Project at Wed Dec 6 23:17:41 UTC 2006. Summary of my perl5 (revision 5 version 8 subversion 8) configuration: Platform: osname=linux, osvers=2.6.18.3, archname=i486-linux-gnu-thread-multi uname='linux saens 2.6.18.3 #1 smp sat nov 25 13:39:52 est 2006 i686 gnulinux ' config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.8.8 -Dsitearch=/usr/local/lib/perl/5.8.8 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dlibperl=libperl.so.5.8.8 -Dd_dosuid -des' hint=recommended, useposix=true, d_sigaction=define usethreads=define use5005threads=undef useithreads=define usemultiplicity=define useperlio=define d_sfio=undef uselargefiles=define usesocks=undef use64bitint=undef use64bitall=undef uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', optimize='-O2', cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include' ccversion='', gccversion='4.1.2 20061115 (prerelease) (Debian 4.1.1-20)', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=4, prototype=define Linker and Libraries: ld='cc', ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt perllibs=-ldl -lm -lpthread -lc -lcrypt libc=/lib/libc-2.3.6.so, so=so, useshrplib=true, libperl=libperl.so.5.8.8 gnulibc_version='2.3.6' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' Locally applied patches: @INC for perl v5.8.8: /home/sthalik/.perl5 /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl . Environment for perl v5.8.8: HOME=/home/sthalik LANG=en_US.UTF-8 LANGUAGE (unset) LC_COLLATE=pl_PL.UTF-8 LC_CTYPE=pl_PL.UTF-8 LC_TIME=pl_PL.UTF-8 LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/home/sthalik/bin:/usr/games:/insane:/insane/standalone:/insane/tools PERL5LIB=/home/sthalik/.perl5 PERL_BADLANG (unset) SHELL=zsh ```
p5pRT commented 17 years ago

From @abigail

On Sun\, Jul 08\, 2007 at 11​:29​:16PM -0700\, sthalik @​ tehran. lain. pl wrote​:

% perl -le '{ my $foo = 42; sub foo { sub { $foo } } } print foo->() + 0' 0

I expect the inner sub to use the current value of $foo. It's not being captured\, though.

This doesn't occur in blead.

Abigail

p5pRT commented 17 years ago

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

p5pRT commented 17 years ago

From @rgs

On 09/07/07\, via RT sthalik @​ tehran. lain. pl \perlbug\-followup@​perl\.org wrote​:

% perl -le '{ my $foo = 42; sub foo { sub { $foo } } } print foo->() + 0' 0

I expect the inner sub to use the current value of $foo. It's not being captured\, though.

That appears to be fixed with 5.9.5.

p5pRT commented 17 years ago

From sthalik@tehran.lain.pl

On Sun\, Jul 08\, 2007\, perlbug-followup@​perl.org wrote​:

Works in 5.9.4. Could you please merge it before the next stable version?

--   /\ Jabber ID :​: sthalik@​jabber.autocom.pl   / Unix stuff :​: http​://tehran.lain.pl   \ \/ Yet Another RBL :​: http​://rbl.lain.pl \/\ Web hosting :​: http​://insane.pl

p5pRT commented 17 years ago

From @ysth

Stanislaw Halik \<sthalik \ tehran.lain.pl> writes​:

Works in 5.9.4. Could you please merge it before the next stable version?

This was part of Dave Mitchell's jumbo closure patch that was deemed by him unsafe for 5.8.x. (Dave\, please correct me if I'm wrong.) So expect it in 5.10.0 only.

The workaround is to introduce a mention of the lexicals you want to close over in the middle​:

$ perl -le '{ my $foo = 42; sub foo { $foo if 0; sub { $foo } } } print foo->() + 0' 42

p5pRT commented 17 years ago

From @iabyn

On Mon\, Jul 09\, 2007 at 08​:55​:37PM +0000\, Yitzchak Scott-Thoennes wrote​:

This was part of Dave Mitchell's jumbo closure patch that was deemed by him unsafe for 5.8.x. (Dave\, please correct me if I'm wrong.) So expect it in 5.10.0 only.

Correct.

-- "Strange women lying in ponds distributing swords is no basis for a system of government. Supreme executive power derives from a mandate from the masses\, not from some farcical aquatic ceremony."   -- Dennis\, "Monty Python and the Holy Grail"

p5pRT commented 17 years ago

From @jimc

Yitzchak Scott-Thoennes wrote​:

Stanislaw Halik \<sthalik \ tehran.lain.pl> writes​:

Works in 5.9.4. Could you please merge it before the next stable version?

This was part of Dave Mitchell's jumbo closure patch that was deemed by him unsafe for 5.8.x. (Dave\, please correct me if I'm wrong.) So expect it in 5.10.0 only.

s/ unsafe / not backwards compatible / ?!

p5pRT commented 17 years ago

From @ysth

On Mon\, July 9\, 2007 9​:53 pm\, Jim Cromie wrote​:

Yitzchak Scott-Thoennes wrote​:

This was part of Dave Mitchell's jumbo closure patch that was deemed by him unsafe for 5.8.x. (Dave\, please correct me if I'm wrong.) So expect it in 5.10.0 only.

s/ unsafe / not backwards compatible / ?!

An unclear line\, since by definition any bug fix is not fully backwards compatible.

I would say it's more unsafe than this (also excluded from 5.8.x) bug fix​:

$ perl5.9.5 -wle'print $#{@​{[0]}}' -1 $ perl5.8.8 -wle'print $#{@​{[0]}}' 0

and people seem to be tripping over that a lot.

p5pRT commented 17 years ago

From @iabyn

On Mon\, Jul 09\, 2007 at 10​:53​:50PM -0600\, Jim Cromie wrote​:

This was part of Dave Mitchell's jumbo closure patch that was deemed by him unsafe for 5.8.x. (Dave\, please correct me if I'm wrong.) So expect it in 5.10.0 only.

s/ unsafe / not backwards compatible / ?!

Unsafe in the sense of (a) involving of lot of internal reworking\, so scope for new bugs\, (b) user-visible changes to closure behaviour\, which although "more correct" might well break existing code - hence not really to be slipped into a maint release.

-- "You may not work around any technical limitations in the software"   -- Windows Vista license

p5pRT commented 16 years ago

p5p@spam.wizbit.be - Status changed from 'open' to 'resolved'