OLD | NEW |
1 | |
2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
3 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
4 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
5 | 4 |
6 // Regression test for the dart2js mirrors implementation that triggers the | 5 // Regression test for the dart2js mirrors implementation that triggers the |
7 // generation of the declarations of a class in the presence of call stubs | 6 // generation of the declarations of a class in the presence of call stubs |
8 // and non-reflectable methods. For neither of the latter an instance mirror | 7 // and non-reflectable methods. For neither of the latter an instance mirror |
9 // should be constructed and they should not be contained in declarations. | 8 // should be constructed and they should not be contained in declarations. |
10 @MirrorsUsed(metaTargets: "Meta") | 9 @MirrorsUsed(metaTargets: "Meta") |
11 import "dart:mirrors"; | 10 import "dart:mirrors"; |
12 import "package:expect/expect.dart"; | 11 import "package:expect/expect.dart"; |
13 | 12 |
14 class Meta { | 13 class Meta { |
15 const Meta(); | 14 const Meta(); |
16 } | 15 } |
17 | 16 |
18 class A { | 17 class A { |
19 @Meta() | 18 @Meta() |
20 reflectableThing(int a, [int b = 9, int c = 42]) => a + b + c; | 19 reflectableThing(int a, [int b = 9, int c = 42]) => a + b + c; |
21 nonReflectableThing(int a, [int b = 4, int c = 21]) => a + b + c; | 20 nonReflectableThing(int a, [int b = 4, int c = 21]) => a + b + c; |
22 } | 21 } |
23 | 22 |
24 tryCall(object, symbol, values, expected) { | 23 tryCall(object, symbol, values, expected) { |
25 var mirror = reflect(object); | 24 var mirror = reflect(object); |
26 var result = mirror.invoke(symbol, values).reflectee; | 25 var result = mirror.invoke(symbol, values).reflectee; |
27 Expect.equals(result, expected); | 26 Expect.equals(result, expected); |
28 } | 27 } |
29 | 28 |
30 @NoInline() @AssumeDynamic() | 29 @NoInline() |
| 30 @AssumeDynamic() |
31 hide(x) => x; | 31 hide(x) => x; |
32 | 32 |
33 main() { | 33 main() { |
34 var a = hide(new A()); | 34 var a = hide(new A()); |
35 // Make sure we statically have some calls to reflectableThing with 1, 2 and | 35 // Make sure we statically have some calls to reflectableThing with 1, 2 and |
36 // 3 arguments so that stubs are generated. | 36 // 3 arguments so that stubs are generated. |
37 Expect.equals(1 + 9 + 42, a.reflectableThing(1)); | 37 Expect.equals(1 + 9 + 42, a.reflectableThing(1)); |
38 Expect.equals(1 + 5 + 42, a.reflectableThing(1, 5)); | 38 Expect.equals(1 + 5 + 42, a.reflectableThing(1, 5)); |
39 Expect.equals(1 + 22 + 3, a.reflectableThing(1, 22, 3)); | 39 Expect.equals(1 + 22 + 3, a.reflectableThing(1, 22, 3)); |
40 // Try calling methods through reflection. | 40 // Try calling methods through reflection. |
41 tryCall(a, #reflectableThing, [1], 1 + 9 + 42); | 41 tryCall(a, #reflectableThing, [1], 1 + 9 + 42); |
42 tryCall(a, #reflectableThing, [1, 5], 1 + 5 + 42); | 42 tryCall(a, #reflectableThing, [1, 5], 1 + 5 + 42); |
43 tryCall(a, #reflectableThing, [1, 22, 3], 1 + 22 + 3); | 43 tryCall(a, #reflectableThing, [1, 22, 3], 1 + 22 + 3); |
44 Expect.throws(() => tryCall(a, #nonReflectableThing, [1], 1 + 4 + 21)); | 44 Expect.throws(() => tryCall(a, #nonReflectableThing, [1], 1 + 4 + 21)); |
45 Expect.throws(() => tryCall(a, #nonReflectableThing, [1, 5], 1 + 5 + 21)); | 45 Expect.throws(() => tryCall(a, #nonReflectableThing, [1, 5], 1 + 5 + 21)); |
46 Expect.throws(() => tryCall(a, #nonReflectableThing, [1, 13, 7], 1 + 13 + 7)); | 46 Expect.throws(() => tryCall(a, #nonReflectableThing, [1, 13, 7], 1 + 13 + 7)); |
47 // Trigger generation of all declarations and check they only contain a | 47 // Trigger generation of all declarations and check they only contain a |
48 // a single entry. | 48 // a single entry. |
49 var declarations = reflect(a).type.declarations; | 49 var declarations = reflect(a).type.declarations; |
50 Expect.equals(1, declarations.keys.length); | 50 Expect.equals(1, declarations.keys.length); |
51 Expect.equals(#reflectableThing, declarations.keys.first); | 51 Expect.equals(#reflectableThing, declarations.keys.first); |
52 } | 52 } |
OLD | NEW |