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

Unified Diff: pkg/compiler/lib/src/types/abstract_value_domain.dart

Issue 1415883005: Introduce AbstractValue and AbstractValueDomain (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years 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: pkg/compiler/lib/src/types/abstract_value_domain.dart
diff --git a/pkg/compiler/lib/src/types/abstract_value_domain.dart b/pkg/compiler/lib/src/types/abstract_value_domain.dart
new file mode 100644
index 0000000000000000000000000000000000000000..14c9939a9d1f0207ebb7a51b62c5f2b510fa0277
--- /dev/null
+++ b/pkg/compiler/lib/src/types/abstract_value_domain.dart
@@ -0,0 +1,164 @@
+// 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.
+
+library dart2js.abstract_value_domain;
+
+import '../constants/values.dart';
+import '../dart_types.dart';
+import '../elements/elements.dart';
+import '../native/native.dart' show
+ NativeBehavior;
+import '../universe/selector.dart' show
+ Selector;
+import '../universe/universe.dart' show
+ ReceiverConstraint;
+
+enum AbstractBool {
+ True, False, Maybe, Nothing
+}
+
+/// A value in an abstraction of runtime values.
+abstract class AbstractValue {}
+
+/// A system that implements an abstraction over runtime values and provides
+/// access to interprocedural analysis results.
+// TODO(johnniwinther): Consider extracting the inference result access from
+// this interface.
+abstract class AbstractValueDomain {
sra1 2015/12/02 17:42:24 With these concrete types there will only be one i
asgerf 2015/12/02 18:05:07 FWIW, I think of this as AbstractDomain<T>, but in
+ AbstractValue get dynamicType;
+ AbstractValue get typeType;
+ AbstractValue get functionType;
+ AbstractValue get boolType;
+ AbstractValue get intType;
+ AbstractValue get doubleType;
+ AbstractValue get numType;
+ AbstractValue get stringType;
+ AbstractValue get listType;
+ AbstractValue get mapType;
+ AbstractValue get nonNullType;
+ AbstractValue get nullType;
+ AbstractValue get extendableArrayType;
+ AbstractValue get fixedArrayType;
+ AbstractValue get arrayType;
+ AbstractValue get uint31Type;
+ AbstractValue get uint32Type;
+ AbstractValue get uintType;
+
+ AbstractValue get numStringBoolType;
+
+ AbstractValue get fixedLengthType;
+
+ AbstractValue get interceptorType;
+
+ AbstractValue get interceptedTypes;
+
+ bool methodUsesReceiverArgument(FunctionElement function);
+
+ Element locateSingleElement(AbstractValue mask, Selector selector);
+
+ ClassElement singleClass(AbstractValue mask);
+
+ bool needsNoSuchMethodHandling(AbstractValue mask, Selector selector);
+
+ AbstractValue getReceiverType(MethodElement method);
+
+ AbstractValue getParameterType(ParameterElement parameter);
+
+ AbstractValue getReturnType(FunctionElement function);
+
+ AbstractValue getInvokeReturnType(Selector selector, AbstractValue mask);
+
+ AbstractValue getFieldType(FieldElement field);
+
+ AbstractValue join(AbstractValue a, AbstractValue b);
+
+ AbstractValue intersection(AbstractValue a, AbstractValue b);
+
+ AbstractValue getTypeOf(ConstantValue constant);
+
+ /// Returns the constant value if the [AbstractValue] represents a single
+ /// constant value. Returns `null` if [value] is not a constant.
+ ConstantValue getConstantOf(AbstractValue value);
+
+ AbstractValue nonNullExact(ClassElement element);
+
+ AbstractValue nonNullSubclass(ClassElement element);
+
+ AbstractValue nonNullSubtype(ClassElement element);
+
+ bool isDefinitelyBool(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyNum(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyString(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyNumStringBool(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyNotNumStringBool(AbstractValue t);
+
+ /// True if all values of [t] are either integers or not numbers at all.
+ ///
+ /// This does not imply that the value is an integer, since most other values
+ /// such as null are also not a non-integer double.
+ bool isDefinitelyNotNonIntegerDouble(AbstractValue t);
+
+ bool isDefinitelyNonNegativeInt(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyInt(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyUint31(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyUint32(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyUint(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyArray(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyMutableArray(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyFixedArray(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyExtendableArray(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyIndexable(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyMutableIndexable(AbstractValue t, {bool allowNull: false});
+
+ bool isDefinitelyFixedLengthIndexable(AbstractValue t,
+ {bool allowNull: false});
+
+ bool isDefinitelyIntercepted(AbstractValue t, {bool allowNull});
+
+ /// Given a class from the interceptor hierarchy, returns an [AbstractValue]
+ /// matching all values with that interceptor (or a subtype thereof).
+ AbstractValue getInterceptorSubtypes(ClassElement class_);
+
+ bool areDisjoint(AbstractValue leftType, AbstractValue rightType);
+
+ bool isMorePreciseOrEqual(AbstractValue t1, AbstractValue t2);
+
+ AbstractBool isSubtypeOf(AbstractValue value,
+ DartType type,
+ {bool allowNull});
+
+ /// Returns whether [value] is one of the falsy values: false, 0, -0, NaN,
+ /// the empty string, or null.
+ AbstractBool boolify(AbstractValue value);
+
+ AbstractBool strictBoolify(AbstractValue type);
+
+ /// Create a type mask containing at least all subtypes of [type].
+ AbstractValue subtypesOf(DartType type);
+
+ /// Returns a subset of [receiver] containing at least the types
+ /// that can respond to [selector] without throwing.
+ AbstractValue receiverTypeFor(Selector selector, AbstractValue receiver);
+
+ /// The result of an index operation on [value], or the dynamic type if
+ /// unknown.
+ AbstractValue elementTypeOfIndexable(AbstractValue value);
+
+ /// The length property of [value], or `null` if unknown.
+ int getContainerLength(AbstractValue value);
+}

Powered by Google App Engine
This is Rietveld 408576698