d6ef495a9a
Change-Id: I9f922f8a4106f993c63b55ebbe3c54ea999cbbd4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426287 Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Commit-Queue: Lasse Nielsen <lrn@google.com>
97 lines
3.2 KiB
Dart
97 lines
3.2 KiB
Dart
// Copyright (c) 2013, 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.
|
|
|
|
// VMOptions=--optimization-counter-threshold=90
|
|
|
|
import "dart:mirrors";
|
|
import "package:expect/expect.dart";
|
|
import "package:expect/variations.dart";
|
|
|
|
void main() {
|
|
for (int i = 0; i < 100; i++) {
|
|
test();
|
|
}
|
|
}
|
|
|
|
void test() {
|
|
ClassMirror cm = reflectClass(Null);
|
|
|
|
InstanceMirror im1 = reflect(null);
|
|
Expect.equals(cm, im1.type);
|
|
if (!unsoundNullSafety) {
|
|
Expect.throwsTypeError(
|
|
() => im1.invoke(const Symbol("=="), [null]),
|
|
'null not assignable to Object',
|
|
);
|
|
} else {
|
|
Expect.isTrue(im1.invoke(const Symbol("=="), [null]).reflectee);
|
|
}
|
|
Expect.isFalse(im1.invoke(const Symbol("=="), [42]).reflectee);
|
|
|
|
var obj = confuse(null); // Null value that isn't known at compile-time.
|
|
InstanceMirror im2 = reflect(obj);
|
|
Expect.equals(cm, im2.type);
|
|
if (!unsoundNullSafety) {
|
|
Expect.throwsTypeError(
|
|
() => im2.invoke(const Symbol("=="), [null]),
|
|
'null not assignable to Object',
|
|
);
|
|
} else {
|
|
Expect.isTrue(im2.invoke(const Symbol("=="), [null]).reflectee);
|
|
}
|
|
Expect.isFalse(im2.invoke(const Symbol("=="), [42]).reflectee);
|
|
|
|
InstanceMirror nullMirror = reflect(null);
|
|
Expect.isTrue(nullMirror.getField(#hashCode).reflectee is int);
|
|
Expect.equals(null.hashCode, nullMirror.getField(#hashCode).reflectee);
|
|
Expect.equals('Null', nullMirror.getField(#runtimeType).reflectee.toString());
|
|
if (!unsoundNullSafety) {
|
|
Expect.throwsTypeError(
|
|
() => nullMirror.invoke(#==, [null]),
|
|
'null not assignable to Object',
|
|
);
|
|
} else {
|
|
Expect.isTrue(nullMirror.invoke(#==, [null]).reflectee);
|
|
}
|
|
Expect.isFalse(nullMirror.invoke(#==, [new Object()]).reflectee);
|
|
Expect.equals('null', nullMirror.invoke(#toString, []).reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => nullMirror.invoke(#notDefined, []),
|
|
'noSuchMethod',
|
|
);
|
|
|
|
ClassMirror NullMirror = nullMirror.type;
|
|
Expect.equals(reflectClass(Null), NullMirror);
|
|
Expect.equals(#Null, NullMirror.simpleName);
|
|
Expect.equals(#Object, NullMirror.superclass!.simpleName);
|
|
Expect.equals(null, NullMirror.superclass!.superclass);
|
|
Expect.listEquals([], NullMirror.superinterfaces);
|
|
Map<Uri, LibraryMirror> libraries = currentMirrorSystem().libraries;
|
|
LibraryMirror? coreLibrary = libraries[Uri.parse('dart:core')];
|
|
if (coreLibrary == null) {
|
|
// In minified mode we don't preserve the URIs.
|
|
coreLibrary = libraries.values.firstWhere(
|
|
(LibraryMirror lm) => lm.simpleName == #dart.core,
|
|
);
|
|
Uri uri = coreLibrary.uri;
|
|
Expect.equals("https", uri.scheme);
|
|
Expect.equals("dartlang.org", uri.host);
|
|
Expect.equals("/dart2js-stripped-uri", uri.path);
|
|
}
|
|
Expect.equals(coreLibrary, NullMirror.owner);
|
|
}
|
|
|
|
// Magic incantation to avoid the compiler recognizing the constant values
|
|
// at compile time. If the result is computed at compile time, the dynamic code
|
|
// will not be tested.
|
|
confuse(x) {
|
|
try {
|
|
if (new DateTime.now().millisecondsSinceEpoch == 42) x = 42;
|
|
throw [x];
|
|
} on List catch (e) {
|
|
return e[0];
|
|
}
|
|
return 42;
|
|
}
|