develooper Front page | perl.perl5.porters | Postings from November 2004

[perl #32713] Class member vanishes during global destruction

From:
email @ christoph-haas . de
Date:
November 30, 2004 07:22
Subject:
[perl #32713] Class member vanishes during global destruction
Message ID:
rt-3.0.11-32713-101293.16.5720342719396@perl.org
# New Ticket Created by  email@christoph-haas.de 
# Please include the string:  [perl #32713]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=32713 >



This is a bug report for perl from email@christoph-haas.de,
generated with the help of perlbug 1.35 running under perl v5.8.4.


-----------------------------------------------------------------
It seems like in some cases class members disappear during the
garbage collector's global destruction. I have prepared two
test files at http://workaround.org/perl-problem/ that show
the problem.

The "Helper.pm" declares a simple class that does nothing really
except creating (new) and destroying (DESTROY) an object.
The "helper" script just creates an object and does nothing
else. Even the supplied "sub test" is not called. When running
./helper the creation and destruction of the object is shown.
It looks like this here:

NEW:$VAR1 = {
          'cgi' => bless( {
                            '.parameters' => [],
                            '.charset' => 'ISO-8859-1',
                            '.fieldnames' => {},
                            'escape' => 1
                          }, 'CGI' ),
          'foo' => 42
        };
DESTROY:$VAR1 = bless( {
                 'cgi' => undef,
                 'foo' => 42
               }, 'Helper' );

So the CGI object (as a member of the Helper class) is created
correctly. Just when it comes to the global destruction it gets
lost. Other members like 'foo' however stay there. So it seems
like the CGI class is destroyed before the destruction of the
Helper class. This is not what I expected.

When I call $helper->DESTROY then the CGI class is still
existing. So it's not a problem of the DESTROY sub but of
the global destruction that happens automatically at the end
of the program.

Interesting though: when I declare a lexical (local) variable
in the "sub test" (that is completely unused!) then the CGI
object is also still there. Just if I use $helper from the
global main context it fails.

I could verify that in Perl 5.6.0 this works as expected. Two
other users in the IRC (#perl) verified this problem.


[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
    category=core
    severity=medium
---
Site configuration information for perl v5.8.4:

Configured by Debian Project at Wed Sep  1 12:11:29 CEST 2004.

Summary of my perl5 (revision 5 version 8 subversion 4) configuration:
  Platform:
    osname=linux, osvers=2.6.7.fb, archname=i386-linux-thread-multi
    uname='linux downhill 2.6.7.fb #1 sun jul 18 15:42:00 cest 2004 i686 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.8.4 -Dsitearch=/usr/local/lib/perl/5.8.4 -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 -Uusesfio -Uusenm -Duseshrplib -Dlibperl=libperl.so.5.8.4 -Dd_dosuid -des'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -I/usr/local/include'
    ccversion='', gccversion='3.3.4 (Debian 1:3.3.4-9)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, libperl=libperl.so.5.8.4
    gnulibc_version='2.3.2'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:
    

---
@INC for perl v5.8.4:
    /etc/perl
    /usr/local/lib/perl/5.8.4
    /usr/local/share/perl/5.8.4
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.8
    /usr/share/perl/5.8
    /usr/local/lib/site_perl
    .

---
Environment for perl v5.8.4:
    HOME=/home/chaas
    LANG=de_DE@euro
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
    PERL_BADLANG (unset)
    SHELL=/bin/zsh




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