|  | // 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 { | 
|  | late Function onX; | 
|  | X() { | 
|  | Timer.run(() => onX(new Y())); | 
|  | } | 
|  | } | 
|  |  | 
|  | class Y { | 
|  | late Function onY; | 
|  | var heavyMemory; | 
|  | static var count = 0; | 
|  | Y() { | 
|  | // Consume large amounts of memory per iteration to fail/succeed quicker. | 
|  | heavyMemory = new List.filled(10 * 1024 * 1024, null); | 
|  | // Terminate the test if we allocated enough memory without running out. | 
|  | if (count++ > 100) return; | 
|  | Timer.run(() => 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(); | 
|  | } |