| Index: pkg/kernel/runtime/reify/interceptors.dart
|
| diff --git a/pkg/kernel/runtime/reify/interceptors.dart b/pkg/kernel/runtime/reify/interceptors.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..af4368d521cb23340ce2aacd01022c82839b1270
|
| --- /dev/null
|
| +++ b/pkg/kernel/runtime/reify/interceptors.dart
|
| @@ -0,0 +1,73 @@
|
| +// 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.
|
| +
|
| +library kernel.transformations.reify.runtime.interceptors;
|
| +
|
| +import 'types.dart' show ReifiedType;
|
| +
|
| +/// Helper method that generates a [ReifiedType] corresponding to the literal
|
| +/// type [type].
|
| +///
|
| +/// Calls to this method are recognized in the transformation and replaced by
|
| +/// code that constructs the correct type.
|
| +ReifiedType reify(Type type) {
|
| + throw "This method should never be called in translated code";
|
| +}
|
| +
|
| +/// Marker interface to indicate that we can extract the runtime type using
|
| +/// a property getter.
|
| +abstract class HasRuntimeTypeGetter {
|
| + ReifiedType get $type;
|
| +}
|
| +
|
| +/// Interceptor to safely access the type of an object.
|
| +///
|
| +/// For native objects that do not have the `$type` field on them, the
|
| +/// interceptor directly returns the type, otherwise the value of the field is
|
| +/// returned.
|
| +ReifiedType type(dynamic o) {
|
| + if (o == null) {
|
| + return reify(Null);
|
| + } else if (o is HasRuntimeTypeGetter) {
|
| + return o.$type;
|
| + } else if (o is bool) {
|
| + return reify(bool);
|
| + } else if (o is String) {
|
| + return reify(String);
|
| + } else if (o is int) {
|
| + return reify(int);
|
| + } else if (o is double) {
|
| + return reify(double);
|
| + } else if (o is Type) {
|
| + return reify(Type);
|
| + } else if (o is AbstractClassInstantiationError) {
|
| + return reify(AbstractClassInstantiationError);
|
| + } else if (o is NoSuchMethodError) {
|
| + return reify(NoSuchMethodError);
|
| + } else if (o is CyclicInitializationError) {
|
| + return reify(CyclicInitializationError);
|
| + } else if (o is UnsupportedError) {
|
| + return reify(UnsupportedError);
|
| + } else if (o is IntegerDivisionByZeroException) {
|
| + return reify(IntegerDivisionByZeroException);
|
| + } else if (o is RangeError) {
|
| + return reify(RangeError);
|
| + } else if (o is ArgumentError) {
|
| + return reify(ArgumentError);
|
| + }
|
| + ReifiedType type = _type[o];
|
| + if (type != null) {
|
| + return type;
|
| + }
|
| + throw 'Unable to get runtime type of ${o.runtimeType}';
|
| +}
|
| +
|
| +// This constructor call is not intercepted with [attachType] since the runtime
|
| +// library is currently never transformed.
|
| +final Expando _type = new Expando();
|
| +
|
| +dynamic attachType(Object o, ReifiedType t) {
|
| + _type[o] = t;
|
| + return o;
|
| +}
|
|
|