Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1101)

Unified Diff: tests/compiler/dart2js/elide_callthrough_stub_test.dart

Issue 2180363002: Avoid using call-through stub on calls to fields. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: add test Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/ssa/optimize.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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'));
+ }));
+}
« no previous file with comments | « pkg/compiler/lib/src/ssa/optimize.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698