Index: tests/compiler/dart2js/elide_callthrough_stub_test.dart |
diff --git a/tests/compiler/dart2js/elide_callthrough_stub_test.dart b/tests/compiler/dart2js/elide_callthrough_stub_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9366df99f1f893d965f640f522dab322b69e18c6 |
--- /dev/null |
+++ b/tests/compiler/dart2js/elide_callthrough_stub_test.dart |
@@ -0,0 +1,60 @@ |
+// 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. |
+ |
+// 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 '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() { |
+ asyncTest(() => compileAll(TEST1).then((generated) { |
+ // Direct call through field. |
+ Expect.isTrue(generated.contains(r'this._fun.call$1(zzz)')); |
+ // No stub. |
+ Expect.isFalse(generated.contains(r'_fun$1:')); |
+ // No call to stub. |
+ Expect.isFalse(generated.contains(r'_fun$1(')); |
+ })); |
+ |
+ asyncTest(() => compileAll(TEST2).then((generated) { |
+ // No call through field. |
+ Expect.isFalse(generated.contains(r'this._fun.call$1(zzz)')); |
+ // Call through stub. |
+ Expect.isTrue(generated.contains(r'this._fun$1(zzz)')); |
+ // Stub is generated. |
+ Expect.isTrue(generated.contains(r'_fun$1:')); |
+ // Call through getter (inside stub). |
+ Expect.isTrue(generated.contains(r'get$_fun().call$1')); |
+ })); |
+} |