[prev in list] [next in list] [prev in thread] [next in thread]
List: perl5-porters
Subject: [perl #76814] FETCH called twice
From: Abigail (via RT) <perlbug-followup () perl ! org>
Date: 2010-07-29 21:15:27
Message-ID: rt-3.6.HEAD-11314-1280438127-652.76814-75-0 () perl ! org
[Download RAW message or body]
# New Ticket Created by Abigail
# Please include the string: [perl #76814]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=76814 >
This is a bug report for perl from abigail@abigail.be,
generated with the help of perlbug 1.39 running under perl 5.12.1.
-----------------------------------------------------------------
[Please describe your issue here]
A couple of my CPAN modules broke recently, due to FETCH, under certain
conditions, being called twice.
This is a reduced test case:
use 5.010;
use strict;
use warnings;
my $count;
sub TIESCALAR {bless []}
sub FETCH {$count ++; 1}
tie my $foo => "main";
{no warnings 'void'; $foo eq 'foo';}
say $count;
__END__
This should print '1'. However, with blead, it prints 2.
git bisect tells commit 6f1401dc2acd2a2b85df22b0a74e5f7e6e0a33aa is the
culprit. This is the commit entry:
commit 6f1401dc2acd2a2b85df22b0a74e5f7e6e0a33aa
Author: David Mitchell <davem@iabyn.com>
Date: Fri May 21 14:18:21 2010 +0100
make overload respect get magic
In most places, ops checked their args for overload *before* doing
mg_get(). This meant that, among other issues, tied vars that
returned overloaded objects wouldn't trigger calling the
overloaded method. (Actually, for tied and arrays and hashes, it
still often would since mg_get gets called beforehand in rvalue
context).
This patch does the following:
Makes sure get magic is called first.
Moves most of the overload code formerly included by macros at the
start of each pp function into the separate helper functions
Perl_try_amagic_bin, Perl_try_amagic_un, S_try_amagic_ftest,
with 3 new wrapper macros:
tryAMAGICbin_MG, tryAMAGICun_MG, tryAMAGICftest_MG.
This made the code 3800 bytes smaller.
Makes sure that FETCH is not called multiple times. Much of this
bit was helped by some earlier work from Father Chrysostomos.
Added new functions and macros sv_inc_nomg(), sv_dec_nomg(),
dPOPnv_nomg, dPOPXiirl_ul_nomg, dPOPTOPnnrl_nomg, dPOPTOPiirl_ul_nomg
dPOPTOPiirl_nomg, SvIV_please_nomg, SvNV_nomg (again, some of
these were based on Father Chrysostomos's work).
Fixed the list version of the repeat operator (x): it now only
calls overloaded methods for the scalar version:
(1,2,$overloaded) x 10
The only thing I haven't checked/fixed yet is overloading the
iterator operator, <>.
I'll write a couple of test cases for this and commit them.
Abigail
[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
category=core
severity=medium
---
Site configuration information for perl 5.12.1:
Configured by abigail at Wed May 19 02:45:31 CEST 2010.
Summary of my perl5 (revision 5 version 12 subversion 1) configuration:
Platform:
osname=linux, osvers=2.6.11-1.1369_fc4smp, archname=i686-linux-64int-ld
uname='linux almanda 2.6.11-1.1369_fc4smp #1 smp thu jun 2 23:08:39 edt 2005 i686 \
i686 i386 gnulinux ' config_args='-des -Dusedevel -Uversiononly \
-Dmydomain=.abigail.be -Dcf_email=abigail@abigail.be -Dperladmin=abigail@abigail.be \
-Doptimize=-g -Dcc=gcc -Dprefix=/opt/perl -Dusemorebits' hint=recommended, \
useposix=true, d_sigaction=define useithreads=undef, usemultiplicity=undef
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=undef, uselongdouble=define
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include \
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', optimize='-g',
cppflags='-DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.0.2 20051125 (Red Hat 4.0.2-8)', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long long', ivsize=8, nvtype='long double', nvsize=12, Off_t='off_t', \
lseeksize=8 alignbytes=4, prototype=define
Linker and Libraries:
ld='gcc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
libc=/lib/libc-2.3.5.so, so=so, useshrplib=false, libperl=libperl.a
gnulibc_version='2.3.5'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -g -L/usr/local/lib'
Locally applied patches:
---
@INC for perl 5.12.1:
/home/abigail/Perl
/opt/perl/lib/site_perl/5.12.1/i686-linux-64int-ld
/opt/perl/lib/site_perl/5.12.1
/opt/perl/lib/5.12.1/i686-linux-64int-ld
/opt/perl/lib/5.12.1
/opt/perl/lib/site_perl/5.12.0/i686-linux-64int-ld
/opt/perl/lib/site_perl/5.12.0
/opt/perl/lib/site_perl/5.10.1
/opt/perl/lib/site_perl/5.10.0
/opt/perl/lib/site_perl/5.8.8
/opt/perl/lib/site_perl
.
---
Environment for perl 5.12.1:
HOME=/home/abigail
LANG=en_US.UTF-8
LANGUAGE (unset)
LC_CTYPE=en_US.utf8
LC_MESSAGES=en_US.utf8
LD_LIBRARY_PATH=/home/abigail/Lib:/usr/local/lib:/usr/lib:/lib:/usr/X11R6/lib
LOGDIR (unset)
PATH=/home/abigail/Bin:/opt/perl/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin: \
/usr/sbin:/sbin:/usr/X11R6/bin:/usr/games:/opt/git/bin:/home/abigail/Perl/Photos:/home/abigail/Perl/Bin:/opt/mysql/bin
PERL5LIB=/home/abigail/Perl
PERLDIR=/opt/perl
PERL_BADLANG (unset)
SHELL=/bin/bash
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic