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

Owner: Nobody
Requestors: Raphael.Manfredi [at] st.com
Cc:
AdminCc:

Operating System: Solaris
PatchStatus: (no value)
Severity: fatal
Type: utilities
Perl Version: 5.005_03
Fixed In: (no value)



From: Raphael Manfredi <Raphael.Manfredi [...] st.com>
To: perlbug [...] perl.com
Subject: Anomaly in caller() returned values
Date: Wed, 17 Nov 1999 16:31:55 +0100
Download (untitled) / with headers
text/plain 2.9k
----------------------------------------------------------------- There is an anomaly in the way caller() returns its arguments. Watch: 1 sub a { 2 b(); 3 } 4 5 sub b { 6 my ($pack, $file, $line, $sub) = caller(1); 7 print "b() called from $sub/$line\n"; 8 } 9 10 a(); which produces: b() called from main::a/10 If caller(0) is used instead in line 6, I get: b() called from main::b/2 The anomaly is that $sub refers to the calling routine, but not the line number. To get it, one must re-use caller() with an (offset-1) with respect to the targetted call frame. Raphael ----------------------------------------------------------------- --- Site configuration information for perl 5.00503: Configured by manfredi at Mon Aug 9 12:37:05 MET DST 1999. Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration: Platform: osname=solaris, osvers=2.5.1, archname=sun4-solaris uname='sunos lod23 5.5.1 generic_103640-27 sun4u sparc sunw,ultra-60 ' hint=previous, useposix=true, d_sigaction=define usethreads=undef useperlio=define d_sfio=undef Compiler: cc='/apa/SUNWspro/bin/cc', optimize='-O', gccversion= cppflags='-I/home/manfredi/usr/BerkeleyDB/include' ccflags ='-I/home/manfredi/usr/BerkeleyDB/include' stdchar='unsigned char', d_stdstdio=define, usevfork=true intsize=4, longsize=4, ptrsize=4, doublesize=8 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16 alignbytes=8, usemymalloc=y, prototype=define Linker and Libraries: ld='/apa/SUNWspro/bin/cc', ldflags ='-L/home/manfredi/usr/BerkeleyDB/lib' libpth=/lib /usr/lib /usr/ccs/lib /home/manfredi/usr/BerkeleyDB/lib libs=-lsocket -lnsl -ldl -lm -lc -lcrypt libc=/lib/libc.so, so=so, useshrplib=false, libperl=libperl.a Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' ' cccdlflags='-KPIC', lddlflags='-G -L/home/manfredi/usr/BerkeleyDB/lib' Locally applied patches: --- @INC for perl 5.00503: /home/manfredi/usr/lib/perl /home/manfredi/usr/lib/perl5/5.00503/sun4-solaris /home/manfredi/usr/lib/perl5/5.00503 /home/manfredi/usr/lib/perl5/site_perl/5.005/sun4-solaris /home/manfredi/usr/lib/perl5/site_perl/5.005 . --- Environment for perl 5.00503: HOME=/home/manfredi LANG=fr LANGUAGE (unset) LC_MESSAGES=C LC_MONETARY=C LC_NUMERIC=C LC_TIME=C LD_LIBRARY_PATH=/home/manfredi/usr/lib/X11:/usr/openwin/lib LOGDIR (unset) PATH=/home/manfredi/bin/scripts:/home/manfredi/bin/sun:/home/manfredi/bin/sun/mh:/home/manfredi/bin/scripts/mh:/home/manfredi/bin/sun/fm2html:/home/manfredi/bin/scripts/rdb:/apa/gnu/SunOS5/bin:/bin:/usr/bin:/sbin:/usr/sbin:/apa/SUNWspro/bin:/usr/ccs/bin:/usr/ucb:/usr/contrib/bin:/apa/comp/SunOS5/bin:/apa/acroread/3.02/bin:/apa/ddts/bin:/apa/util/bin:/etc:/usr/bin/X11:/usr/games:/home/bruel/local/SunOS5/bin:/home/manfredi:.:/home/manfredi/bin/acri PERL_BADLANG (unset) SHELL=/home/manfredi/bin/sun/ksh
To: Raphael Manfredi <Raphael.Manfredi [...] st.com>
Cc: perl5-porters [...] perl.org
Subject: Re: [ID 19991117.001] Anomaly in caller() returned values
Date: Wed, 17 Nov 1999 09:59:00 -0800
From: Gurusamy Sarathy <gsar [...] ActiveState.com>
Download (untitled) / with headers
text/plain 1008b
On Wed, 17 Nov 1999 16:31:55 +0100, Raphael Manfredi wrote: Show quoted text
>There is an anomaly in the way caller() returns its arguments. >Watch: > > 1 sub a { > 2 b(); > 3 } > 4 > 5 sub b { > 6 my ($pack, $file, $line, $sub) = caller(1); > 7 print "b() called from $sub/$line\n"; > 8 } > 9 > 10 a(); > >which produces: > > b() called from main::a/10 > >If caller(0) is used instead in line 6, I get: > > b() called from main::b/2 > >The anomaly is that $sub refers to the calling routine, but >not the line number. To get it, one must re-use caller() >with an (offset-1) with respect to the targetted call frame.
FWIW, I don't think there's a bug here. What's probably misleading is the way the message is written. caller() simply reports the attributes of the executing context "frame", and they look correct in the above. Try a message more like: print "executing $sub() at $line\n"; and you'll see what I mean. Sarathy gsar@ActiveState.com
From: Raphael Manfredi <Raphael.Manfredi [...] st.com>
To: gsar [...] activestate.com
Cc: perl5-porters [...] perl.org
Subject: Re: [ID 19991117.001] Anomaly in caller() returned values
Date: Thu, 18 Nov 1999 09:50:27 +0100
Download (untitled) / with headers
text/plain 927b
Quoting gsar@activestate.com: :>The anomaly is that $sub refers to the calling routine, but :>not the line number. To get it, one must re-use caller() :>with an (offset-1) with respect to the targetted call frame. : :FWIW, I don't think there's a bug here. What's probably :misleading is the way the message is written. caller() simply :reports the attributes of the executing context "frame", and :they look correct in the above. Try a message more like: I did not say it was a bug, I said it was an "anomaly". ;-) Seriously, I was astonished by the behaviour, but you're right. I had the "wording" wrong in my head, hence the interpretation was also wrong. Perhaps the example you gave me should go in the documentation? Somehow, I thought caller(0) would give MY OWN stack frame, since $subroutine is set to my name, but no, it's giving the name of the subroutine called, which is mine! Hence my confusion. Raphael


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