Skip Menu |
Report information
Id: 132442
Status: resolved
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: zefram [at] fysh.org
Cc:
AdminCc:

Operating System: (no value)
PatchStatus: (no value)
Severity: medium
Type: core
Perl Version: 5.27.5
Fixed In: (no value)



Date: Tue, 14 Nov 2017 06:25:12 +0000
Subject: lexical sub decl clears stack
CC: zefram [...] fysh.org
To: perlbug [...] perl.org
From: zefram [...] fysh.org
This is a bug report for perl from zefram@fysh.org, generated with the help of perlbug 1.40 running under perl 5.27.5. ----------------------------------------------------------------- [Please describe your issue here] $ perl -lwe 'print for qw(aa bb), do { my sub lleexx; 123 }, qw(cc dd)' 123 cc dd Observe that at the point of "my sub", at runtime, the main stack gets cleared, losing the items that had been pushed by an outer scope and which should have been retained through the execution of the do{} expression. This gets even weirder if there are multiple levels of list in play: $ perl -MData::Dumper -lwe 'print Dumper [ qw(aa bb), [qw(pp qq), do { my sub lleexx; 123 }, qw(rr ss)], qw(cc dd) ]' $VAR1 = [ 123, 'rr', [ 'ss' ], 'cc', 'dd' ]; [Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=core severity=medium --- Site configuration information for perl 5.27.5: Configured by zefram at Fri Oct 20 23:24:00 BST 2017. Summary of my perl5 (revision 5 version 27 subversion 5) configuration: Platform: osname=linux osvers=3.16.0-4-amd64 archname=x86_64-linux-thread-multi uname='linux barba.rous.org 3.16.0-4-amd64 #1 smp debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 gnulinux ' config_args='-des -Dprefix=/home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52 -Duselargefiles -Dusethreads -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dusedevel -Uversiononly -Ui_db' hint=recommended useposix=true d_sigaction=define useithreads=define usemultiplicity=define use64bitint=define use64bitall=define uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='cc' ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' optimize='-O2' cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' ccversion='' gccversion='4.9.2' gccosandvers='' intsize=4 longsize=8 ptrsize=8 doublesize=8 byteorder=12345678 doublekind=3 d_longlong=define longlongsize=8 d_longdbl=define longdblsize=16 longdblkind=3 ivtype='long' ivsize=8 nvtype='double' nvsize=8 Off_t='off_t' lseeksize=8 alignbytes=8 prototype=define Linker and Libraries: ld='cc' ldflags =' -fstack-protector-strong -L/usr/local/lib' libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib libs=-lpthread -lnsl -ldb -ldl -lm -lcrypt -lutil -lc perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc libc=libc-2.19.so so=so useshrplib=true libperl=libperl.so gnulibc_version='2.19' Dynamic Linking: dlsrc=dl_dlopen.xs dlext=so d_dlsymun=undef ccdlflags='-Wl,-E -Wl,-rpath,/home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/5.27.5/x86_64-linux-thread-multi/CORE' cccdlflags='-fPIC' lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong' --- @INC for perl 5.27.5: /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/site_perl/5.27.5/x86_64-linux-thread-multi /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/site_perl/5.27.5 /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/5.27.5/x86_64-linux-thread-multi /home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/lib/5.27.5 --- Environment for perl 5.27.5: HOME=/home/zefram LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/zefram/usr/perl/perl_install/perl-5.27.5-i64-f52/bin:/home/zefram/usr/perl/util:/home/zefram/pub/x86_64-unknown-linux-gnu/bin:/home/zefram/pub/common/bin:/usr/bin:/bin:/usr/local/bin:/usr/games PERLDOC=-oman PERL_BADLANG (unset) SHELL=/usr/bin/zsh
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.1k
On Mon, 13 Nov 2017 22:25:29 -0800, zefram@fysh.org wrote: Show quoted text
> > This is a bug report for perl from zefram@fysh.org, > generated with the help of perlbug 1.40 running under perl 5.27.5. > > > ----------------------------------------------------------------- > [Please describe your issue here] > > $ perl -lwe 'print for qw(aa bb), do { my sub lleexx; 123 }, qw(cc > dd)' > 123 > cc > dd > > Observe that at the point of "my sub", at runtime, the main stack gets > cleared, losing the items that had been pushed by an outer scope and > which > should have been retained through the execution of the do{} > expression. > This gets even weirder if there are multiple levels of list in play: > > $ perl -MData::Dumper -lwe 'print Dumper [ qw(aa bb), [qw(pp qq), do { > my sub lleexx; 123 }, qw(rr ss)], qw(cc dd) ]' > $VAR1 = [ > 123, > 'rr', > [ > 'ss' > ], > 'cc', > 'dd' > ];
Even better: $ ./perl -lwe 'print join "-", qw(aa bb), do { my sub l; 123 }, qw(cc dd ee ff gg)' cc123dd123ee123ff123gg I have a fix. I’m just waiting for tests to finish. -- Father Chrysostomos
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.2k
On Tue, 14 Nov 2017 16:23:02 -0800, sprout wrote: Show quoted text
> On Mon, 13 Nov 2017 22:25:29 -0800, zefram@fysh.org wrote:
> > > > This is a bug report for perl from zefram@fysh.org, > > generated with the help of perlbug 1.40 running under perl 5.27.5. > > > > > > ----------------------------------------------------------------- > > [Please describe your issue here] > > > > $ perl -lwe 'print for qw(aa bb), do { my sub lleexx; 123 }, qw(cc > > dd)' > > 123 > > cc > > dd > > > > Observe that at the point of "my sub", at runtime, the main stack > > gets > > cleared, losing the items that had been pushed by an outer scope and > > which > > should have been retained through the execution of the do{} > > expression. > > This gets even weirder if there are multiple levels of list in play: > > > > $ perl -MData::Dumper -lwe 'print Dumper [ qw(aa bb), [qw(pp qq), do > > { > > my sub lleexx; 123 }, qw(rr ss)], qw(cc dd) ]' > > $VAR1 = [ > > 123, > > 'rr', > > [ > > 'ss' > > ], > > 'cc', > > 'dd' > > ];
> > Even better: > > $ ./perl -lwe 'print join "-", qw(aa bb), do { my sub l; 123 }, qw(cc > dd ee ff gg)' > cc123dd123ee123ff123gg > > I have a fix. I’m just waiting for tests to finish.
Fixed in 695d6585affc. -- Father Chrysostomos
Download (untitled) / with headers
text/plain 317b
Thank you for filing this report. You have helped make Perl better. With the release yesterday of Perl 5.28.0, this and 185 other issues have been resolved. Perl 5.28.0 may be downloaded via: https://metacpan.org/release/XSAWYERX/perl-5.28.0 If you find that the problem persists, feel free to reopen this ticket.


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