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

Unified Diff: test/codegen/lib/mirrors/invoke_closurization2_test.dart

Issue 2265533002: Add mirrors tests (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 4 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
Index: test/codegen/lib/mirrors/invoke_closurization2_test.dart
diff --git a/test/codegen/lib/mirrors/invoke_closurization2_test.dart b/test/codegen/lib/mirrors/invoke_closurization2_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..b768fba593d16dfa1398809003fbe369aae0e757
--- /dev/null
+++ b/test/codegen/lib/mirrors/invoke_closurization2_test.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2014, 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.
+
+library test.invoke_closurization_test;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class A {
+ foo() => "foo";
+ bar([x]) => "bar-$x";
+ gee({named}) => "gee-$named";
+
+ // Methods that must be intercepted.
+
+ // Tear-offs we will also get without mirrors.
+ codeUnitAt(x) => "codeUnitAt-$x";
+ toUpperCase() => "toUpperCase";
+ // indexOf takes an optional argument in String.
+ indexOf(x) => "indexOf-$x";
+ // lastIndexOf matches signature from String.
+ lastIndexOf(x, [y]) => "lastIndexOf-$x,$y";
+ // splitMapJoin matches signature from String.
+ splitMapJoin(x, {onMatch, onNonMatch}) =>
+ "splitMapJoin-$x,$onMatch,$onNonMatch";
+ // Same name as intercepted, but with named argument.
+ trim({named}) => "trim-$named";
+
+ // Tear-offs we will not call directly.
+ endsWith(x) => "endsWith-$x";
+ toLowerCase() => "toLowerCase";
+ // matchAsPrefix matches signature from String.
+ matchAsPrefix(x, [y = 0]) => "matchAsPrefix-$x,$y";
+ // Matches signature from List
+ toList({growable: true}) => "toList-$growable";
+ // Same name as intercepted, but with named argument.
+ toSet({named}) => "toSet-$named";
+}
+
+// The recursive call makes inlining difficult.
+// The use of DateTime.now makes the result unpredictable.
+confuse(x) {
+ if (new DateTime.now().millisecondsSinceEpoch == 42) {
+ return confuse(new DateTime.now().millisecondsSinceEpoch);
+ }
+ return x;
+}
+
+main() {
+ var list = ["foo", new List(), new A()];
+
+ getAMirror() => reflect(list[confuse(2)]);
+
+ // Tear-off without mirrors.
+ var f = confuse(getAMirror().reflectee.codeUnitAt);
+ Expect.equals("codeUnitAt-42", f(42));
+ f = confuse(getAMirror().reflectee.toUpperCase);
+ Expect.equals("toUpperCase", f());
+ f = confuse(getAMirror().reflectee.indexOf);
+ Expect.equals("indexOf-499", f(499));
+ f = confuse(getAMirror().reflectee.lastIndexOf);
+ Expect.equals("lastIndexOf-FOO,BAR", f("FOO", "BAR"));
+ f = confuse(getAMirror().reflectee.splitMapJoin);
+ Expect.equals("splitMapJoin-1,2,3", f(1, onMatch: 2, onNonMatch: 3));
+ f = confuse(getAMirror().reflectee.trim);
+ Expect.equals("trim-true", f(named: true));
+
+ // Now the same thing through mirrors.
+ f = getAMirror().getField(#codeUnitAt).reflectee;
+ Expect.equals("codeUnitAt-42", f(42));
+ f = getAMirror().getField(#toUpperCase).reflectee;
+ Expect.equals("toUpperCase", f());
+ f = getAMirror().getField(#indexOf).reflectee;
+ Expect.equals("indexOf-499", f(499));
+ f = getAMirror().getField(#lastIndexOf).reflectee;
+ Expect.equals("lastIndexOf-FOO,BAR", f("FOO", "BAR"));
+ f = getAMirror().getField(#splitMapJoin).reflectee;
+ Expect.equals("splitMapJoin-1,2,3", f(1, onMatch: 2, onNonMatch: 3));
+ f = getAMirror().getField(#trim).reflectee;
+ Expect.equals("trim-true", f(named: true));
+
+ // Now the same thing through mirrors and mirror-invocation.
+ f = getAMirror().getField(#codeUnitAt);
+ Expect.equals("codeUnitAt-42", f.invoke(#call, [42], {}).reflectee);
+ f = getAMirror().getField(#toUpperCase);
+ Expect.equals("toUpperCase", f.invoke(#call, [], {}).reflectee);
+ f = getAMirror().getField(#indexOf);
+ Expect.equals("indexOf-499", f.invoke(#call, [499], {}).reflectee);
+ f = getAMirror().getField(#lastIndexOf);
+ Expect.equals("lastIndexOf-FOO,BAR",
+ f.invoke(#call, ["FOO", "BAR"]).reflectee);
+ f = getAMirror().getField(#splitMapJoin);
+ Expect.equals("splitMapJoin-1,2,3",
+ f.invoke(#call, [1], {#onMatch: 2, #onNonMatch: 3}).reflectee);
+ f = getAMirror().getField(#trim);
+ Expect.equals("trim-true", f.invoke(#call, [], {#named: true}).reflectee);
+
+ // Tear-offs only through mirrors. (No direct selector in the code).
+ // --------
+
+ f = getAMirror().getField(#endsWith).reflectee;
+ Expect.equals("endsWith-42", f(42));
+ f = getAMirror().getField(#toLowerCase).reflectee;
+ Expect.equals("toLowerCase", f());
+ f = getAMirror().getField(#indexOf).reflectee;
+ Expect.equals("indexOf-499", f(499));
+ f = getAMirror().getField(#matchAsPrefix).reflectee;
+ Expect.equals("matchAsPrefix-FOO,BAR", f("FOO", "BAR"));
+ f = getAMirror().getField(#toList).reflectee;
+ Expect.equals("toList-1", f(growable: 1));
+ f = getAMirror().getField(#toSet).reflectee;
+ Expect.equals("toSet-true", f(named: true));
+
+ f = getAMirror().getField(#endsWith);
+ Expect.equals("endsWith-42", f.invoke(#call, [42], {}).reflectee);
+ f = getAMirror().getField(#toLowerCase);
+ Expect.equals("toLowerCase", f.invoke(#call, [], {}).reflectee);
+ f = getAMirror().getField(#indexOf);
+ Expect.equals("indexOf-499", f.invoke(#call, [499], {}).reflectee);
+ f = getAMirror().getField(#matchAsPrefix);
+ Expect.equals("matchAsPrefix-FOO,BAR",
+ f.invoke(#call, ["FOO", "BAR"]).reflectee);
+ f = getAMirror().getField(#toList);
+ Expect.equals("toList-1",
+ f.invoke(#call, [], {#growable: 1}).reflectee);
+ f = getAMirror().getField(#toSet);
+ Expect.equals("toSet-true", f.invoke(#call, [], {#named: true}).reflectee);
+}

Powered by Google App Engine
This is Rietveld 408576698