Front page | perl.perl5.porters |
Postings from September 2010
[perl #77860] \& prototype with sub call parameter
From:
Zefram
Date:
September 16, 2010 00:16
Subject:
[perl #77860] \& prototype with sub call parameter
Message ID:
rt-3.6.HEAD-5116-1284482617-1170.77860-75-0@perl.org
# New Ticket Created by Zefram
# Please include the string: [perl #77860]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=77860 >
This is a bug report for perl from zefram@fysh.org,
generated with the help of perlbug 1.36 running under perl 5.10.0.
-----------------------------------------------------------------
[Please enter your report here]
The \& prototype is meant to take a literal "&foo" as a parameter,
and implicitly enreference it. For example:
$ perl -lwe 'sub foo(\&) { print "foo: ", $_[0]; } sub bar { print "bar"; } foo &bar'
foo: CODE(0xe79ad8)
It rejects anything that's not &-based:
$ perl -lwe 'sub foo(\&) { print "foo: ", $_[0]; } sub bar { print "bar"; } foo 1'
Type of arg 1 to main::foo must be subroutine entry (not constant item) at -e line 1, at EOF
Execution of -e aborted due to compilation errors.
But if the parameter supplies is a subroutine call other than bare &foo,
it does something silly:
$ perl -lwe 'sub foo(\&) { print "foo: ", $_[0]; } sub bar { print "bar"; } foo &bar()'
bar
foo: SCALAR(0x19ffdf0)
$ perl -lwe 'sub foo(\&) { print "foo: ", $_[0]; } sub bar { print "bar"; } foo &bar(1)'
bar
foo: SCALAR(0x1e17df0)
$ perl -lwe 'sub foo(\&) { print "foo: ", $_[0]; } sub bar { print "bar"; } foo bar(1)'
bar
foo: SCALAR(0xca8df0)
$ perl -lwe 'sub foo(\&) { print "foo: ", $_[0]; } sub bar { print "bar"; } foo bar'
bar
foo: SCALAR(0x1a36df0)
It leaves the entersub op intact, rather than extracting only the rv2cv
op, and wraps it in the usual refgen. It should instead have rejected
the parameter as not matching the prototype.
[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
category=core
severity=low
---
Site configuration information for perl 5.10.0:
Configured by Debian Project at Fri Aug 28 22:23:22 UTC 2009.
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
Platform:
osname=linux, osvers=2.6.30.5-dsa-amd64, archname=x86_64-linux-gnu-thread-multi
uname='linux brahms 2.6.30.5-dsa-amd64 #1 smp mon aug 17 02:18:43 cest 2009 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-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=define, use64bitall=define, 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=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /lib64 /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/x86_64-unknown-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
-
[perl #77860] \& prototype with sub call parameter
by Zefram