blob: 0cc36984dfe2d23c88b1dc5c738381da4516787a [file] [log] [blame]
// Copyright (c) 2013, 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 test program testing code GC.
import "package:expect/expect.dart";
import "dart:async";
import "dart:io";
int foo(int x) {
x = x + 1;
return x;
}
List<int> bar() {
// A couple of big allocations trigger GC.
var l = new List.filled(700000, 7);
return l;
}
doTest() {
var i = 0;
foo(1); // Initial call to compile.
// Time passes, GC runs, foo's code is dropped.
var ms = const Duration(milliseconds: 100);
var t = new Timer.periodic(ms, (timer) {
i++;
bar();
if (i > 1) {
timer.cancel();
// foo is called again to make sure we can still run it even after
// its code has been detached.
foo(2);
}
});
}
main() {
var opts = new Options();
if (opts.arguments.contains("--run")) {
doTest();
} else {
// Run the test and capture stdout.
var pr = Process.runSync(Platform.executable,
["--collect-code",
"--code-collection-interval-in-us=100000",
"--log-code-drop",
"--optimization-counter-threshold=-1",
"--package-root=${Platform.packageRoot}",
Platform.script,
"--run"]);
// Code drops are logged with --log-code-drop. Look through stdout for the
// message that foo's code was dropped.
var found = false;
pr.stdout.split("\n").forEach((line) {
if (line.contains("Detaching code") && line.contains("foo")) {
found = true;
}
});
Expect.isTrue(found);
}
}