| // Copyright (c) 2016, 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=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 | |
| // VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true | |
| // Test that 'StaticCall's against "this" go through the unchecked entry-point. | |
| import "common.dart"; | |
| import "package:expect/expect.dart"; | |
| class C<T> { | |
| @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate) | |
| @NeverInline | |
| void target2(T x) { | |
| Expect.notEquals(x, -1); | |
| } | |
| @NeverInline | |
| void target1(T x) { | |
| target2(x); | |
| } | |
| } | |
| main(List<String> args) { | |
| // Make sure the precise runtime-type of C is not known below. | |
| C c = args.length == 0 ? C<int>() : C<String>(); | |
| // Warmup. | |
| expectedEntryPoint = -1; | |
| for (int i = 0; i < 100; ++i) { | |
| c.target1(i); | |
| } | |
| expectedEntryPoint = 1; | |
| const int iterations = benchmarkMode ? 400000000 : 100; | |
| for (int i = 0; i < iterations; ++i) { | |
| c.target1(i); | |
| } | |
| expectedEntryPoint = 0; | |
| dynamic f = c.target2; | |
| f(0); | |
| Expect.isTrue(validateRan); | |
| } |