Index: /branches/release-30/lib/MT/Builder.pm
===================================================================
--- /branches/release-30/lib/MT/Builder.pm (revision 1426)
+++ /branches/release-30/lib/MT/Builder.pm (revision 1427)
@@ -9,4 +9,5 @@
 use strict;
 use base qw( MT::ErrorHandler );
+use MT::Util qw( weaken );
 
 use constant NODE => 'MT::Template::Node';
@@ -208,6 +209,6 @@
             }
         }
-        $rec->[5] = $opt->{parent} || $tmpl;
-        $rec->[6] = $tmpl;
+        weaken($rec->[5] = $opt->{parent} || $tmpl);
+        weaken($rec->[6] = $tmpl);
         push @{ $state->{tokens} }, $rec;
         $pos = pos $text;
@@ -255,6 +256,11 @@
 sub _text_block {
     my $text = substr ${ $_[0]->{text} }, $_[1], $_[2] - $_[1];
-    push @{ $_[0]->{tokens} }, bless [ 'TEXT', $text, undef, undef, undef, $_[0]->{tokens}, $_[0]->{tmpl} ], NODE
-        if (defined $text) && ($text ne '');
+    if ((defined $text) && ($text ne '')) {
+        my $rec = bless [ 'TEXT', $text, undef, undef, undef, $_[0]->{tokens}, $_[0]->{tmpl} ], NODE;
+        # Avoids circular reference between NODE and TOKENS, MT::Template.
+        weaken($rec->[5]);
+        weaken($rec->[6]);
+        push @{ $_[0]->{tokens} }, $rec;
+    }
 }
 
Index: /branches/release-30/lib/MT/Template.pm
===================================================================
--- /branches/release-30/lib/MT/Template.pm (revision 1372)
+++ /branches/release-30/lib/MT/Template.pm (revision 1427)
@@ -9,4 +9,5 @@
 use strict;
 use base qw( MT::Object );
+use MT::Util qw( weaken );
 
 use constant NODE => 'MT::Template::Node';
@@ -143,5 +144,5 @@
     require MT::Template::Context;
     my $ctx = $tmpl->{context} ||= MT::Template::Context->new;
-    $ctx->stash('template', $tmpl);
+    weaken($ctx->{__stash}{'template'} = $tmpl);
     return $ctx;
 }
@@ -616,5 +617,7 @@
     my $tmpl = shift;
     my ($tag, $attr) = @_;
-    return bless [ $tag, $attr, undef, undef, undef, undef, $tmpl ], NODE;
+    my $node = bless [ $tag, $attr, undef, undef, undef, undef, $tmpl ], NODE;
+    weaken($node->[6]);
+    return $node;
 }
 
@@ -622,5 +625,7 @@
     my $tmpl = shift;
     my ($text) = @_;
-    return bless [ 'TEXT', $text, undef, undef, undef, undef, $tmpl ], NODE;
+    my $node = bless [ 'TEXT', $text, undef, undef, undef, undef, $tmpl ], NODE;
+    weaken($node->[6]);
+    return $node;
 }
 
@@ -740,4 +745,5 @@
 
 use strict;
+use MT::Util qw( weaken );
 
 sub setAttribute {
@@ -823,4 +829,5 @@
     my $node = shift;
     $node->[5] = shift if @_;
+    weaken($node->[5]);
     $node->[5];
 }
Index: /branches/release-30/lib/MT/Util.pm
===================================================================
--- /branches/release-30/lib/MT/Util.pm (revision 1425)
+++ /branches/release-30/lib/MT/Util.pm (revision 1427)
@@ -25,5 +25,15 @@
                  extract_urls extract_domain extract_domains is_valid_date
                  epoch2ts ts2epoch escape_unicode unescape_unicode
-                 sax_parser trim ltrim rtrim asset_cleanup caturl multi_iter );
+                 sax_parser trim ltrim rtrim asset_cleanup caturl multi_iter
+                 weaken );
+
+{
+my $Has_Weaken;
+sub weaken {
+    $Has_Weaken = eval 'use Scalar::Util; 1' && Scalar::Util->can('weaken') ? 1 : 0
+        unless defined $Has_Weaken;
+    Scalar::Util::weaken($_[0]) if $Has_Weaken;
+}
+}
 
 sub leap_day {
Index: /branches/release-30/lib/MT/Component.pm
===================================================================
--- /branches/release-30/lib/MT/Component.pm (revision 1174)
+++ /branches/release-30/lib/MT/Component.pm (revision 1427)
@@ -9,5 +9,5 @@
 use strict;
 use base qw( Class::Accessor::Fast MT::ErrorHandler );
-use MT::Util qw(encode_js);
+use MT::Util qw( encode_js weaken );
 
 __PACKAGE__->mk_accessors(qw( id path envelope version schema_version ));
@@ -539,5 +539,6 @@
         if ( ref $r eq 'HASH' ) {
             __deep_localize_labels( $c, $r );
-            $_->{plugin} = $c for grep { ref $_ eq 'HASH' } values %$r;
+            weaken($_->{plugin} = $c)
+                for grep { ref $_ eq 'HASH' } values %$r;
         }
 
Index: /branches/release-30/lib/MT.pm.pre
===================================================================
--- /branches/release-30/lib/MT.pm.pre (revision 1402)
+++ /branches/release-30/lib/MT.pm.pre (revision 1427)
@@ -11,4 +11,5 @@
 use File::Spec;
 use File::Basename;
+use MT::Util qw( weaken );
 
 our ( $VERSION,      $SCHEMA_VERSION );
@@ -398,5 +399,5 @@
     unless ( $mt->{cfg} ) {
         require MT::ConfigMgr;
-        $mt->{cfg} = MT::ConfigMgr->instance;
+        weaken( $mt->{cfg} = MT::ConfigMgr->instance );
     }
     if (@_) {
