// 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 --no-background-compilation 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; } }