| // 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(); |
| } |