develooper Front page | perl.perl5.porters | Postings from December 2011

Re: [perl #106864] refcount for anonymous sub is 2 instead of 1

Thread Previous | Thread Next
From:
Eric Brine
Date:
December 24, 2011 15:55
Subject:
Re: [perl #106864] refcount for anonymous sub is 2 instead of 1
Message ID:
CALJW-qGTJSdigNZN4kVv6eC53j2ARJMd3s5HGf1=Dte13iMAvA@mail.gmail.com
2011/12/22 Olivier Mengué <perlbug-followup@perl.org>

> # New Ticket Created by  Olivier Mengué
> # Please include the string:  [perl #106864]
> # in the subject line of all future correspondence about this issue.
> # <URL: https://rt.perl.org:443/rt3/Ticket/Display.html?id=106864 >
>
>
> This is a bug report for perl from dolmen@cpan.org,
> generated with the help of perlbug 1.39 running under perl 5.10.1.
>
>
> -----------------------------------------------------------------
>
>
> With the following expression:
>
>    my $x = sub { };
>
> the refcount of $x is 2 instead of 1.
> There is no such problem if the sub, instead of behind a simple sub,
> is a closure.
>

>perl -MDevel::Peek -e"for (1..3) { push @a, sub {}; } Dump($a[0]);"
SV = IV(0x57b650) at 0x57b654
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x57b624
  SV = PVCV(0x4a9dd4) at 0x57b624
    REFCNT = 4
    FLAGS = (PADMY,ANON,WEAKOUTSIDE,CVGV_RC)
    COMP_STASH = 0x57b444       "main"
    START = 0x4d2cb8 ===> 0
    ROOT = 0x4d2c9c
    GVGV::GV = 0x4a961c "main" :: "__ANON__"
    FILE = "-e"
    DEPTH = 0
    FLAGS = 0x490
    OUTSIDE_SEQ = 96
    PADLIST = 0x4a954c
    PADNAME = 0x4a960c(0x4a12f4) PAD = 0x4a98fc(0x4a0c64)
    OUTSIDE = 0x57b6b4 (MAIN)

4, one for each element in @a, and one to the sub alive until sub {} needs
it next.

With closures, there would be 4 CVs with one reference each instead of 1 CV
with 4 reference.

Thread Previous | Thread Next


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