Front page | perl.perl5.porters |
Postings from October 1999
[ID 19991029.006] Incorrect binding of lexicals
From:
M.J.T. Guy
Date:
October 29, 1999 11:33
Subject:
[ID 19991029.006] Incorrect binding of lexicals
Message ID:
E11hGqW-0001cO-00@ursa.cus.cam.ac.uk
Ala Qumsieh <aqumsieh@matrox.com> reports in c.l.p.misc that the
following program gives incorrect output:
*********************
#!/usr/local/bin/perl -w
use strict;
package X;
sub new {
my $class = shift;
my $obj = {
X => 1,
Y => 2,
EQN => '$x * $y * $t',
};
return bless $obj, $class;
}
{
my ($x, $y);
sub calculate {
my $obj = shift;
unless (defined $x) { # <---- AAA
$x = $obj->{X}; # <---- BBB
$y = $obj->{Y};
}
my $t = shift;
# print "$x $y\n";
my $z = eval $obj->{EQN};
return $z;
}
}
package main;
my $x = new X;
my $z = $x->calculate(3);
print "Z is $z.\n";
***********************
Now, running the above program generates the following:
Use of uninitialized value at (eval 1) line 1.
Use of uninitialized value at (eval 1) line 1.
Z is 0.
Bug shows in both 5.005_03 and 5.0065_62.
Running under the debugger, we see at points AAA and BBB that $x and $y
refer to different variables:
X::calculate(-:21): unless (defined $x) {
DB<1> x \$x, \$y
0 SCALAR(0x1aba98)
-> undef
1 SCALAR(0x1cbc50)
-> undef
DB<2> s
X::calculate(-:22): $x = $obj->{X};
DB<2> x \$x, \$y
0 SCALAR(0xdd678)
-> undef
1 SCALAR(0xdd690)
-> undef
DB<3>
So the binding of lexicals has got confused in some way.
Mike Guy
% ./perl -V
Summary of my perl5 (revision 5.0 version 5 subversion 62) configuration:
Platform:
osname=sunos, osvers=4.1.3, archname=sun4-sunos
uname='sunos nmg1.csi. 4.1.3 1 sun4c '
config_args='-Doptimise=-O -Uusethreads -des'
hint=previous, useposix=true, d_sigaction=define
usethreads=undef useperlio=undef d_sfio=undef
use64bits=undef usemultiplicity=undef
Compiler:
cc='gcc', optimize='-O', gccversion=2.7.2.3
cppflags='-I/usr/local/include'
ccflags ='-I/usr/local/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=8
alignbytes=8, usemymalloc=y, prototype=define
Linker and Libraries:
ld='ld', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /usr/ucblib
libs=-ldbm -ldl -lm -lc -lposix
libc=/lib/libc.so.1.8, so=so, useshrplib=false, libperl=libperl.a
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' '
cccdlflags='-fpic', lddlflags='-assert nodefinitions -L/usr/local/lib'
Characteristics of this binary (from libperl):
Locally applied patches:
perldoc.temp
install.w
Built under sunos
Compiled at Oct 27 1999 01:31:39
@INC:
/home/mjtg/perl5.005_62a/lib
/home/mjtg/perl5.005_62a/lib
/home/mjtg/perl5.005_62a/lib/site_perl
.
-
[ID 19991029.006] Incorrect binding of lexicals
by M.J.T. Guy