Index: tests/language/closure_cycles_test.dart |
=================================================================== |
--- tests/language/closure_cycles_test.dart (revision 0) |
+++ tests/language/closure_cycles_test.dart (revision 0) |
@@ -0,0 +1,41 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+// Based on dartbug.com/7681 |
+// Verify that context chains do not lead to unintended memory being held. |
+ |
+library closure_cycles_test; |
+ |
+import "dart:async"; |
+ |
+class X { |
+ Function onX; |
+ X() { new Timer(0, (_) => onX(new Y())); } |
+} |
+ |
+class Y { |
+ Function onY; |
+ var heavyMemory; |
+ static var count = 0; |
+ Y() { |
+ // Consume large amounts of memory per iteration to fail/succeed quicker. |
+ heavyMemory = new List(10*1024*1024); |
+ // Terminate the test if we allocated enough memory without running out. |
+ if (count++ > 100) return; |
+ new Timer(0, (_) => onY()); |
+ } |
+} |
+ |
+void doIt() { |
+ var x = new X(); |
+ x.onX = (y) { |
+ y.onY = () { |
+ y; // Capturing y can lead to endless context chains! |
+ doIt(); |
+ }; |
+ }; |
+} |
+ |
+void main() { |
+ doIt(); |
+} |