develooper 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
    .



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About