Changeset 1427

Show
Ignore:
Timestamp:
02/28/08 22:31:24 (6 months ago)
Author:
mpaschal
Message:

Add MT::Util::weaken() that lets us weaken references when available from a properly compiled Scalar::Util
Use weaken() to prevent some circular references from leaking some objects
(apply patches by Hirotaka Ogawa and Brad Choate--thanks!)
BugzID: 66845

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/release-30/lib/MT.pm.pre

    r1402 r1427  
    1111use File::Spec; 
    1212use File::Basename; 
     13use MT::Util qw( weaken ); 
    1314 
    1415our ( $VERSION,      $SCHEMA_VERSION ); 
     
    398399    unless ( $mt->{cfg} ) { 
    399400        require MT::ConfigMgr; 
    400         $mt->{cfg} = MT::ConfigMgr->instance
     401        weaken( $mt->{cfg} = MT::ConfigMgr->instance )
    401402    } 
    402403    if (@_) { 
  • branches/release-30/lib/MT/Builder.pm

    r1426 r1427  
    99use strict; 
    1010use base qw( MT::ErrorHandler ); 
     11use MT::Util qw( weaken ); 
    1112 
    1213use constant NODE => 'MT::Template::Node'; 
     
    208209            } 
    209210        } 
    210         $rec->[5] = $opt->{parent} || $tmpl
    211         $rec->[6] = $tmpl
     211        weaken($rec->[5] = $opt->{parent} || $tmpl)
     212        weaken($rec->[6] = $tmpl)
    212213        push @{ $state->{tokens} }, $rec; 
    213214        $pos = pos $text; 
     
    255256sub _text_block { 
    256257    my $text = substr ${ $_[0]->{text} }, $_[1], $_[2] - $_[1]; 
    257     push @{ $_[0]->{tokens} }, bless [ 'TEXT', $text, undef, undef, undef, $_[0]->{tokens}, $_[0]->{tmpl} ], NODE 
    258         if (defined $text) && ($text ne ''); 
     258    if ((defined $text) && ($text ne '')) { 
     259        my $rec = bless [ 'TEXT', $text, undef, undef, undef, $_[0]->{tokens}, $_[0]->{tmpl} ], NODE; 
     260        # Avoids circular reference between NODE and TOKENS, MT::Template. 
     261        weaken($rec->[5]); 
     262        weaken($rec->[6]); 
     263        push @{ $_[0]->{tokens} }, $rec; 
     264    } 
    259265} 
    260266 
  • branches/release-30/lib/MT/Component.pm

    r1174 r1427  
    99use strict; 
    1010use base qw( Class::Accessor::Fast MT::ErrorHandler ); 
    11 use MT::Util qw(encode_js); 
     11use MT::Util qw( encode_js weaken ); 
    1212 
    1313__PACKAGE__->mk_accessors(qw( id path envelope version schema_version )); 
     
    539539        if ( ref $r eq 'HASH' ) { 
    540540            __deep_localize_labels( $c, $r ); 
    541             $_->{plugin} = $c for grep { ref $_ eq 'HASH' } values %$r; 
     541            weaken($_->{plugin} = $c) 
     542                for grep { ref $_ eq 'HASH' } values %$r; 
    542543        } 
    543544 
  • branches/release-30/lib/MT/Template.pm

    r1372 r1427  
    99use strict; 
    1010use base qw( MT::Object ); 
     11use MT::Util qw( weaken ); 
    1112 
    1213use constant NODE => 'MT::Template::Node'; 
     
    143144    require MT::Template::Context; 
    144145    my $ctx = $tmpl->{context} ||= MT::Template::Context->new; 
    145     $ctx->stash('template', $tmpl); 
     146    weaken($ctx->{__stash}{'template'} = $tmpl); 
    146147    return $ctx; 
    147148} 
     
    616617    my $tmpl = shift; 
    617618    my ($tag, $attr) = @_; 
    618     return bless [ $tag, $attr, undef, undef, undef, undef, $tmpl ], NODE; 
     619    my $node = bless [ $tag, $attr, undef, undef, undef, undef, $tmpl ], NODE; 
     620    weaken($node->[6]); 
     621    return $node; 
    619622} 
    620623 
     
    622625    my $tmpl = shift; 
    623626    my ($text) = @_; 
    624     return bless [ 'TEXT', $text, undef, undef, undef, undef, $tmpl ], NODE; 
     627    my $node = bless [ 'TEXT', $text, undef, undef, undef, undef, $tmpl ], NODE; 
     628    weaken($node->[6]); 
     629    return $node; 
    625630} 
    626631 
     
    740745 
    741746use strict; 
     747use MT::Util qw( weaken ); 
    742748 
    743749sub setAttribute { 
     
    823829    my $node = shift; 
    824830    $node->[5] = shift if @_; 
     831    weaken($node->[5]); 
    825832    $node->[5]; 
    826833} 
  • branches/release-30/lib/MT/Util.pm

    r1425 r1427  
    2525                 extract_urls extract_domain extract_domains is_valid_date 
    2626                 epoch2ts ts2epoch escape_unicode unescape_unicode 
    27                  sax_parser trim ltrim rtrim asset_cleanup caturl multi_iter ); 
     27                 sax_parser trim ltrim rtrim asset_cleanup caturl multi_iter 
     28                 weaken ); 
     29 
     30
     31my $Has_Weaken; 
     32sub weaken { 
     33    $Has_Weaken = eval 'use Scalar::Util; 1' && Scalar::Util->can('weaken') ? 1 : 0 
     34        unless defined $Has_Weaken; 
     35    Scalar::Util::weaken($_[0]) if $Has_Weaken; 
     36
     37
    2838 
    2939sub leap_day {