|  | // Copyright (c) 2020, 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. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  | // VMOptions=--old_gen_heap_size=20 | 
|  |  | 
|  | import "dart:io"; | 
|  | import "dart:isolate"; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | handleRequest(request) { | 
|  | if (request % 2 == 0) { | 
|  | var leak = []; | 
|  | while (true) { | 
|  | leak = [leak]; | 
|  | } | 
|  | } | 
|  | return "Okay"; | 
|  | } | 
|  |  | 
|  | handleMessage(message) { | 
|  | print(">> $message"); | 
|  | var responsePort = message[0]; | 
|  | var request = message[1]; | 
|  | try { | 
|  | responsePort.send(<dynamic>[request, handleRequest(request)]); | 
|  | } catch (e, st) { | 
|  | responsePort.send(<dynamic>[request, "Failed: $e\n$st"]); | 
|  | } | 
|  | } | 
|  |  | 
|  | main(args) async { | 
|  | var child = new RawReceivePort(handleMessage); | 
|  |  | 
|  | var parent; | 
|  | parent = new RawReceivePort((message) { | 
|  | print("<< $message"); | 
|  | var request = message[0]; | 
|  | var response = message[1]; | 
|  | if (request % 2 == 0) { | 
|  | Expect.isTrue(response.contains("Out of Memory")); | 
|  | } else { | 
|  | Expect.equals("Okay", response); | 
|  | } | 
|  | if (request == 5) { | 
|  | child.close(); | 
|  | parent.close(); | 
|  | } else { | 
|  | child.sendPort.send(<dynamic>[parent.sendPort, request + 1]); | 
|  | } | 
|  | }); | 
|  |  | 
|  | child.sendPort.send(<dynamic>[parent.sendPort, 1]); | 
|  | } |