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

nested BEGIN frames missing #9846

Closed
p5pRT opened this issue Aug 21, 2009 · 4 comments
Closed

nested BEGIN frames missing #9846

p5pRT opened this issue Aug 21, 2009 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Aug 21, 2009

Migrated from rt.perl.org#68718 (status was 'rejected')

Searchable as RT68718$

@p5pRT
Copy link
Author

p5pRT commented Aug 21, 2009

From zefram@fysh.org

Created by zefram@fysh.org

More looking at the call stack during compilation. Here's what the
stack looks like inside a BEGIN block​:

$ perl -e 'sub showstack{for(my$i=0;;$i++){my@​c=caller($i);@​c||last;print join(",",@​c),"\n"}} BEGIN { package wibble; main​::showstack() }'
wibble,-e,1,main​::showstack,1,0,,,256,,
main,-e,1,main​::BEGIN,1,0,,,256,,
main,-e,1,(eval),0,0,,,256,,

Now I'll do the showstack-inside-BEGIN *inside* a BEGIN block​:

$ perl -e 'sub showstack{for(my$i=0;;$i++){my@​c=caller($i);@​c||last;print join(",",@​c),"\n"}} BEGIN { package wibble; BEGIN { package wobble; main​::showstack() } }'
wobble,-e,1,main​::showstack,1,0,,,256,,
main,-e,1,wibble​::BEGIN,1,0,,,256,,
main,-e,1,(eval),0,0,,,256,,

I'd expect that middle line instead to be two lines, like this​:

  wibble,-e,1,wibble​::BEGIN,1,0,,,256,,
  main,-e,1,main​::BEGIN,1,0,,,256,,

possibly with an additional "(eval)" stack frame between them (I'm not
sure where that fits in). The missing stack frame does evidently exist,
because lexical pragmas are scoped the way one would expect, with the
inner BEGIN acting as compilation time with respect to the content of the
outer BEGIN. They have distinct $^H and so on. (The package directives
in the above example are exploring this.)

As with the previous bug I reported, the behaviour here is consistent
(modulo length of the caller array) at least back to 5.004.

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl 5.10.0:

Configured by Debian Project at Thu Jan  1 12:43:38 UTC 2009.

Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=linux, osvers=2.6.26-1-686, archname=i486-linux-gnu-thread-multi
    uname='linux rebekka 2.6.26-1-686 #1 smp mon dec 15 18:15:07 utc 2008 i686 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -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 -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des'
    hint=recommended, useposix=true, d_sigaction=define
    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 -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='4.3.2', 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 /usr/lib64
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.7.so, so=so, useshrplib=true, libperl=libperl.so.5.10.0
    gnulibc_version='2.7'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib'

Locally applied patches:
    


@INC for perl 5.10.0:
    /etc/perl
    /usr/local/lib/perl/5.10.0
    /usr/local/share/perl/5.10.0
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.10
    /usr/share/perl/5.10
    /usr/local/lib/site_perl
    .


Environment for perl 5.10.0:
    HOME=/home/zefram
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/zefram/pub/i686-pc-linux-gnu/bin:/home/zefram/pub/common/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/local/bin:/usr/games
    PERL_BADLANG (unset)
    SHELL=/usr/bin/zsh

@p5pRT
Copy link
Author

p5pRT commented Nov 11, 2009

sgc294@internode.on.net - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Dec 12, 2010

From @cpansprout

On Fri Aug 21 16​:31​:36 2009, zefram@​fysh.org wrote​:

More looking at the call stack during compilation. Here's what the
stack looks like inside a BEGIN block​:

$ perl -e 'sub
showstack{for(my$i=0;;$i++){my@​c=caller($i);@​c||last;print
join(",",@​c),"\n"}} BEGIN { package wibble; main​::showstack() }'
wibble,-e,1,main​::showstack,1,0,,,256,,
main,-e,1,main​::BEGIN,1,0,,,256,,
main,-e,1,(eval),0,0,,,256,,

Now I'll do the showstack-inside-BEGIN *inside* a BEGIN block​:

$ perl -e 'sub
showstack{for(my$i=0;;$i++){my@​c=caller($i);@​c||last;print
join(",",@​c),"\n"}} BEGIN { package wibble; BEGIN { package wobble;
main​::showstack() } }'
wobble,-e,1,main​::showstack,1,0,,,256,,
main,-e,1,wibble​::BEGIN,1,0,,,256,,
main,-e,1,(eval),0,0,,,256,,

I'd expect that middle line instead to be two lines, like this​:

wibble\,\-e\,1\,wibble​::BEGIN\,1\,0\,\,\,256\,\,
main\,\-e\,1\,main​::BEGIN\,1\,0\,\,\,256\,\,

possibly with an additional "(eval)" stack frame between them (I'm not
sure where that fits in). The missing stack frame does evidently
exist,
because lexical pragmas are scoped the way one would expect, with the
inner BEGIN acting as compilation time with respect to the content of
the
outer BEGIN. They have distinct $^H and so on. (The package
directives
in the above example are exploring this.)

The first BEGIN block is not returned by caller() for the same reason that

  sub foo { BEGIN { main​::showstack } }

does not list foo. foo has not been called.

The outer BEGIN block is not called until it has been complied. When the
inner BEGIN block runs, the outer block has not been compiled yet so the
output of caller is correct. So this is not a bug.

@p5pRT
Copy link
Author

p5pRT commented Dec 12, 2010

@cpansprout - Status changed from 'open' to 'rejected'

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

1 participant