Files
sdk/tests/language/deoptimized_function_on_stack_test.dart
T
floitsch@google.com 5dc8107c53 Revert "Remove Expect from core library."
This reverts commit 19755.

Review URL: https://codereview.chromium.org//12743005

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@19756 260f80e4-7a28-3924-810f-c04153c831b5
2013-03-09 03:19:07 +00:00

57 lines
1.4 KiB
Dart

// 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.
// This is a test for deoptimization infrastructure and to reproduce the
// failure from bug 5442338.
main() {
warmup();
runTest();
}
// Create a situation where method 'call' is optimized for using class A
// when calling foo.
warmup() {
List a = [ new A(), new A(), new A(), new A()];
var res = 0;
for (int i = 0; i < 2000; i++) {
res = call(a, 0);
}
Expect.equals(10, res);
}
// Create a situation where several optimized frames of 'call' are on stack
// when deoptimization occurs because B.foo is called. After the first
// deoptimization, several optimized frames of 'call' are still on stack and
// some of them will be deoptimized.
runTest() {
List a = [ new A(), new A(), new B(), new A(), new B(), new B()];
var res = call(a, 0);
Expect.equals(35, res);
}
// This method will be optimized for using class A when calling 'foo' and
// later will be deoptimized because B.foo is required.
call(List a, int n) {
if (n < a.length) {
var sum = call(a, n + 1);
for (int i = n; i < a.length; i++) {
sum += a[i].foo();
}
return sum;
}
return 0;
}
class A {
foo() { return 1; }
}
class B {
foo() { return 2; }
}