Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Caller return unexpected info for subs called from condition under while #15639

Open
p5pRT opened this issue Oct 1, 2016 · 3 comments
Open

Comments

@p5pRT
Copy link

p5pRT commented Oct 1, 2016

Migrated from rt.perl.org#129777 (status was 'open')

Searchable as RT129777$

@p5pRT
Copy link
Author

p5pRT commented Oct 1, 2016

From @KES777

Created by @KES777

$ cat test.pl
#!/usr/bin/env perl

sub t0 {
  $l = 0;
  print "@​l\n" while @​l = (caller $l++)[1,2];
  1;
}

while( t0() && 0 ){

}

while( t0() && 1 ){
  last;
}

while( t0() && $i < 2 ){
  $i++;
}

do{

} while( t0() && 0 );

$ test.pl
test.pl 9 # EXPECTED
test.pl 13 # EXPECTED
test.pl 17 # EXPECTED
test.pl 18 # FAIL Here I expect 17
test.pl 18 # FAIL Here I expect 17
test.pl 21 # FAIL Here I expect 25

As you can see LINE information differ between first and followed calls of &t0

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.24.0:

Configured by kes at Tue Jun  7 00:21:02 EEST 2016.

Summary of my perl5 (revision 5 version 24 subversion 0) configuration:
   
  Platform:
    osname=linux, osvers=3.13.0-37-generic, archname=x86_64-linux
    uname='linux kes-desktop 3.13.0-37-generic #64-ubuntu smp mon sep 22 21:28:38 utc 2014 x86_64 x86_64 x86_64 gnulinux '
    config_args='-de -Dprefix=/home/kes/perl5/perlbrew/perls/perl-5.24.0 -Aeval:scriptdir=/home/kes/perl5/perlbrew/perls/perl-5.24.0/bin'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.8.4', 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 -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.8/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 -ldl -lm -lcrypt -lutil -lc
    perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
    libc=libc-2.19.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.19'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'

Locally applied patches:
    Devel::PatchPerl 1.38


@INC for perl 5.24.0:
    /home/kes/perl5/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0/x86_64-linux
    /home/kes/perl5/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0
    /home/kes/perl5/perlbrew/perls/perl-5.24.0/lib/5.24.0/x86_64-linux
    /home/kes/perl5/perlbrew/perls/perl-5.24.0/lib/5.24.0
    .


Environment for perl 5.24.0:
    HOME=/home/kes
    LANG=ru_UA.UTF-8
    LANGUAGE=en
    LC_MESSAGES=en_US.UTF-8
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/kes/perl5/perlbrew/bin:/home/kes/perl5/perlbrew/perls/perl-5.24.0/bin:/home/kes/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    PERLBREW=command perlbrew
    PERLBREW_BASHRC_VERSION=0.76
    PERLBREW_HOME=/home/kes/.perlbrew
    PERLBREW_MANPATH=/home/kes/perl5/perlbrew/perls/perl-5.24.0/man
    PERLBREW_PATH=/home/kes/perl5/perlbrew/bin:/home/kes/perl5/perlbrew/perls/perl-5.24.0/bin
    PERLBREW_PERL=perl-5.24.0
    PERLBREW_ROOT=/home/kes/perl5/perlbrew
    PERLBREW_VERSION=0.76
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Mar 21, 2017

From @iabyn

On Sat, Oct 01, 2016 at 03​:48​:13AM -0700, KES wrote​:

$ cat test.pl
#!/usr/bin/env perl

sub t0 {
$l = 0;
print "@​l\n" while @​l = (caller $l++)[1,2];
1;
}

while( t0() && 0 ){

}

while( t0() && 1 ){
last;
}

while( t0() && $i < 2 ){
$i++;
}

do{

} while( t0() && 0 );

$ test.pl
test.pl 9 # EXPECTED
test.pl 13 # EXPECTED
test.pl 17 # EXPECTED
test.pl 18 # FAIL Here I expect 17
test.pl 18 # FAIL Here I expect 17
test.pl 21 # FAIL Here I expect 25

As you can see LINE information differ between first and followed calls of &t0

Currently perl only records line number information in nextstate ops,
which prefix each statement. The most recent nextstate to be executed
defines the current line number from the point of view of warnings,
caller() etc.

On entry to a while loop, the most-recently-executed nextstate is the one
prefixing the whole while statement. On the second and subsequent
iterations the most-recently-executed nextstate is the one prefixing the
last statement in the body of the loop.

There is talk from time-to-time of recording line-number info per op rather
than only per nextstate op; this would fix a whole bunch of such bugs.

In the meantime I'll attach this ticket to the

  #128666​: [META] Line numbers are reported incorrectly

meta-ticket.

--
I thought I was wrong once, but I was mistaken.

@p5pRT
Copy link
Author

p5pRT commented Mar 21, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants