Index: lib/runtime/dart/_rtti.js |
diff --git a/lib/runtime/dart/_rtti.js b/lib/runtime/dart/_rtti.js |
deleted file mode 100644 |
index 168f91e4d9844b06e69cef6446834a412e301b1d..0000000000000000000000000000000000000000 |
--- a/lib/runtime/dart/_rtti.js |
+++ /dev/null |
@@ -1,178 +0,0 @@ |
-// Copyright (c) 2015, 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. |
- |
-/* This library defines the association between runtime objects and |
- * runtime types. |
-*/ |
- |
-dart_library.library('dart/_rtti', null, /* Imports */[ |
-], /* Lazy Imports */[ |
- 'dart/_utils', |
- 'dart/core', |
- 'dart/_types' |
-], function(exports, dart_utils, core, types) { |
- 'use strict'; |
- |
- const defineLazyProperty = dart_utils.defineLazyProperty; |
- |
- const defineProperty = Object.defineProperty; |
- |
- /** |
- * Runtime type information. This module defines the mapping from |
- * runtime objects to their runtime type information. See the types |
- * module for the definition of how type information is represented. |
- * |
- * Runtime objects fall into four main categories: |
- * |
- * - Things represented by javascript primitives, such as |
- * null, numbers, booleans, strings, and symbols. For these |
- * we map directly from the javascript type (given by typeof) |
- * to the appropriate class type from core, which serves as their |
- * rtti. |
- * |
- * - Functions, which are represented by javascript functions. |
- * Representations of Dart functions always have a |
- * _runtimeType property attached to them with the appropriate |
- * rtti. |
- * |
- * - Objects (instances) which are represented by instances of |
- * javascript (ES6) classes. Their types are given by their |
- * classes, and the rtti is accessed by projecting out their |
- * constructor field. |
- * |
- * - Types objects, which are represented as described in the types |
- * module. Types always have a _runtimeType property attached to |
- * them with the appropriate rtti. The rtti for these is always |
- * core.Type. TODO(leafp): consider the possibility that we can |
- * reliably recognize type objects and map directly to core.Type |
- * rather than attaching this property everywhere. |
- * |
- */ |
- |
- /** |
- *Tag a closure with a type, using one of three forms: |
- * dart.fn(cls) marks cls has having no optional or named |
- * parameters, with all argument and return types as dynamic |
- * dart.fn(cls, func) marks cls with the lazily computed |
- * runtime type as computed by func() |
- * dart.fn(cls, rType, argsT, extras) marks cls as having the |
- * runtime type dart.functionType(rType, argsT, extras) |
- * |
- * Note that since we are producing a type for a concrete function, |
- * it is sound to use the definite arrow type. |
- */ |
- function fn(closure, ...args) { |
- // Closure and a lazy type constructor |
- if (args.length == 1) { |
- defineLazyProperty(closure, _runtimeType, {get : args[0]}); |
- return closure; |
- } |
- let t; |
- if (args.length == 0) { |
- // No type arguments, it's all dynamic |
- t = types.definiteFunctionType( |
- types.dynamic, Array(closure.length).fill(types.dynamic)); |
- } else { |
- // We're passed the piecewise components of the function type, |
- // construct it. |
- t = types.definiteFunctionType.apply(null, args); |
- } |
- tag(closure, t); |
- return closure; |
- } |
- exports.fn = fn; |
- |
- // TODO(vsm): How should we encode the runtime type? |
- const _runtimeType = Symbol('_runtimeType'); |
- |
- function checkPrimitiveType(obj) { |
- switch (typeof obj) { |
- case "undefined": |
- return core.Null; |
- case "number": |
- return Math.floor(obj) == obj ? core.int : core.double; |
- case "boolean": |
- return core.bool; |
- case "string": |
- return core.String; |
- case "symbol": |
- return Symbol; |
- } |
- // Undefined is handled above. For historical reasons, |
- // typeof null == "object" in JS. |
- if (obj === null) return core.Null; |
- return null; |
- } |
- |
- function runtimeType(obj) { |
- let result = checkPrimitiveType(obj); |
- if (result !== null) return result; |
- return obj.runtimeType; |
- } |
- exports.runtimeType = runtimeType; |
- |
- function getFunctionType(obj) { |
- // TODO(vsm): Encode this properly on the function for Dart-generated code. |
- let args = Array(obj.length).fill(types.dynamic); |
- return types.definiteFunctionType(types.bottom, args); |
- } |
- |
- /** |
- * Returns the runtime type of obj. This is the same as `obj.realRuntimeType` |
- * but will not call an overridden getter. |
- * |
- * Currently this will return null for non-Dart objects. |
- */ |
- function realRuntimeType(obj) { |
- let result = checkPrimitiveType(obj); |
- if (result !== null) return result; |
- // TODO(vsm): Should we treat Dart and JS objects differently here? |
- // E.g., we can check if obj instanceof core.Object to differentiate. |
- result = obj[_runtimeType]; |
- if (result) return result; |
- result = obj.constructor; |
- if (result == Function) { |
- // An undecorated Function should have come from |
- // JavaScript. Treat as untyped. |
- return types.jsobject; |
- } |
- return result; |
- } |
- exports.realRuntimeType = realRuntimeType; |
- |
- function LazyTagged(infoFn) { |
- class _Tagged { |
- get [_runtimeType]() {return infoFn();} |
- } |
- return _Tagged; |
- } |
- exports.LazyTagged = LazyTagged; |
- |
- function read(value) { |
- return value[_runtimeType]; |
- } |
- exports.read = read; |
- |
- function tag(value, info) { |
- value[_runtimeType] = info; |
- } |
- exports.tag = tag; |
- |
- function tagComputed(value, compute) { |
- defineProperty(value, _runtimeType, { get: compute }); |
- } |
- exports.tagComputed = tagComputed; |
- |
- function tagMemoized(value, compute) { |
- let cache = null; |
- function getter() { |
- if (compute == null) return cache; |
- cache = compute(); |
- compute = null; |
- return cache; |
- } |
- tagComputed(value, getter); |
- } |
- exports.tagMemoized = tagMemoized; |
-}); |