| // 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. |
| |
| // @dart = 2.7 |
| |
| // Check that calls through fields elide the call-through stub. This |
| // optimization is done by the simplifier, so inlining does not need to be |
| // enabled. |
| |
| import 'package:async_helper/async_helper.dart'; |
| import 'package:expect/expect.dart'; |
| import '../helpers/compiler_helper.dart'; |
| |
| const String TEST1 = r''' |
| class W { |
| final Function _fun; |
| W(this._fun); |
| foo(zzz) => _fun(zzz); // this._fun$1(zzz) --> this._fun.call$1(zzz) |
| } |
| add1(x) => x + 1; |
| main() { |
| var w = new W(add1); |
| var x = w.foo(42); |
| } |
| '''; |
| |
| const String TEST2 = r''' |
| class W { |
| final Function __fun; |
| Function get _fun => __fun; |
| W(this.__fun); |
| foo(zzz) => _fun(zzz); // this._fun$1(zzz) stays same. |
| } |
| add1(x) => x + 1; |
| main() { |
| var w = new W(add1); |
| var x = w.foo(42); |
| } |
| '''; |
| |
| main() { |
| runTests() async { |
| String generated1 = await compileAll(TEST1); |
| // Direct call through field. |
| Expect.isTrue(generated1.contains(r'this._fun.call$1(zzz)')); |
| // No stub. |
| Expect.isFalse(generated1.contains(r'_fun$1:')); |
| // No call to stub. |
| Expect.isFalse(generated1.contains(r'_fun$1(')); |
| |
| String generated2 = await compileAll(TEST2); |
| // No call through field. |
| Expect.isFalse(generated2.contains(r'this._fun.call$1(zzz)')); |
| // Call through stub. |
| Expect.isTrue(generated2.contains(r'this._fun$1(zzz)')); |
| // Stub is generated. |
| Expect.isTrue(generated2.contains(r'_fun$1:')); |
| // Call through getter (inside stub). |
| Expect.isTrue(generated2.contains(r'get$_fun().call$1')); |
| } |
| |
| asyncTest(() async { |
| print('--test from kernel------------------------------------------------'); |
| await runTests(); |
| }); |
| } |