dart-sdk/tests/language/optimize/deoptimized_function_on_stack_test.dart
Robert Nystrom c959c9aba7 Migrate language_2/optimize to NNBD.
Change-Id: I3f67dd79ff2ee745cc2ea161ce7150630e805c97
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150186
Commit-Queue: Bob Nystrom <rnystrom@google.com>
Auto-Submit: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
2020-06-06 01:42:35 +00:00

61 lines
1.5 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.
// VMOptions=--optimization-counter-threshold=10
import "package:expect/expect.dart";
// 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 < 20; 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;
}
}