mirror of
https://github.com/dart-lang/sdk
synced 2024-09-18 20:41:24 +00:00
[dart2js] Started skeleton for a powerset abstract value domain
This is based on the wrapped version that also includes a bit integer. Right now the methods use the old abstract value domain but will use the integer bits in later CLs. Also added and updated a flag so that now there is one for a wrapped domain and another for a powerset domain.. Change-Id: Iab6b93584a9a644dfef92f689c4be8c42ce8076a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/157620 Commit-Queue: Christian Altamirano <coam@google.com> Reviewed-by: Stephen Adams <sra@google.com>
This commit is contained in:
parent
768fd39317
commit
7689769bfc
|
@ -29,6 +29,7 @@ class Flags {
|
|||
static const String experimentalAllocationsPath =
|
||||
'--experimental-allocations-path';
|
||||
|
||||
static const String experimentalWrapped = '--experimental-wrapped';
|
||||
static const String experimentalPowersets = '--experimental-powersets';
|
||||
|
||||
// Temporary experiment for code generation of locals for frequently used
|
||||
|
|
|
@ -29,6 +29,7 @@ import 'frontend_strategy.dart';
|
|||
import 'inferrer/abstract_value_domain.dart' show AbstractValueStrategy;
|
||||
import 'inferrer/trivial.dart' show TrivialAbstractValueStrategy;
|
||||
import 'inferrer/powersets/wrapped.dart' show WrappedAbstractValueStrategy;
|
||||
import 'inferrer/powersets/powersets.dart' show PowersetStrategy;
|
||||
import 'inferrer/typemasks/masks.dart' show TypeMaskStrategy;
|
||||
import 'inferrer/types.dart'
|
||||
show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
|
||||
|
@ -139,9 +140,11 @@ abstract class Compiler {
|
|||
abstractValueStrategy = options.useTrivialAbstractValueDomain
|
||||
? const TrivialAbstractValueStrategy()
|
||||
: const TypeMaskStrategy();
|
||||
if (options.experimentalPowersets) {
|
||||
if (options.experimentalWrapped) {
|
||||
abstractValueStrategy =
|
||||
WrappedAbstractValueStrategy(abstractValueStrategy);
|
||||
} else if (options.experimentalPowersets) {
|
||||
abstractValueStrategy = PowersetStrategy(abstractValueStrategy);
|
||||
}
|
||||
|
||||
CompilerTask kernelFrontEndTask;
|
||||
|
|
|
@ -460,6 +460,7 @@ Future<api.CompilationResult> compile(List<String> argv,
|
|||
new OptionHandler(Flags.disableProgramSplit, passThrough),
|
||||
new OptionHandler(Flags.disableTypeInference, passThrough),
|
||||
new OptionHandler(Flags.useTrivialAbstractValueDomain, passThrough),
|
||||
new OptionHandler(Flags.experimentalWrapped, passThrough),
|
||||
new OptionHandler(Flags.experimentalPowersets, passThrough),
|
||||
new OptionHandler(Flags.disableRtiOptimization, passThrough),
|
||||
new OptionHandler(Flags.terse, passThrough),
|
||||
|
|
722
pkg/compiler/lib/src/inferrer/powersets/powersets.dart
Normal file
722
pkg/compiler/lib/src/inferrer/powersets/powersets.dart
Normal file
|
@ -0,0 +1,722 @@
|
|||
// Copyright (c) 2018, 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.
|
||||
|
||||
import '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
|
||||
import '../../elements/entities.dart';
|
||||
import '../../elements/names.dart';
|
||||
import '../../elements/types.dart' show DartType;
|
||||
import '../../ir/static_type.dart';
|
||||
import '../../serialization/serialization.dart';
|
||||
import '../../universe/selector.dart';
|
||||
import '../../universe/world_builder.dart';
|
||||
import '../../universe/use.dart';
|
||||
import '../../world.dart';
|
||||
import '../abstract_value_domain.dart';
|
||||
|
||||
class PowersetValue implements AbstractValue {
|
||||
final AbstractValue _abstractValue;
|
||||
final int _powersetBits;
|
||||
const PowersetValue(this._abstractValue, this._powersetBits);
|
||||
|
||||
@override
|
||||
bool operator ==(var other) {
|
||||
if (identical(this, other)) return true;
|
||||
if (other is! PowersetValue) return false;
|
||||
PowersetValue otherPowerset = other;
|
||||
return other is PowersetValue &&
|
||||
_abstractValue == otherPowerset._abstractValue &&
|
||||
_powersetBits == otherPowerset._powersetBits;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
return _abstractValue.hashCode * _powersetBits.hashCode;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() =>
|
||||
'[Powerset of ${_abstractValue.toString()} with bits ${_powersetBits}]';
|
||||
}
|
||||
|
||||
AbstractValue unwrapOrNull(PowersetValue powerset) {
|
||||
return powerset == null ? null : powerset._abstractValue;
|
||||
}
|
||||
|
||||
PowersetValue wrapOrNull(AbstractValue abstractValue, int powersetBits) {
|
||||
return abstractValue == null
|
||||
? null
|
||||
: PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
class PowersetDomain implements AbstractValueDomain {
|
||||
final AbstractValueDomain _abstractValueDomain;
|
||||
const PowersetDomain(this._abstractValueDomain);
|
||||
|
||||
@override
|
||||
AbstractValue get dynamicType {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.dynamicType;
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
void writeAbstractValueToDataSink(
|
||||
DataSink sink, covariant PowersetValue value) {
|
||||
_abstractValueDomain.writeAbstractValueToDataSink(
|
||||
sink, value._abstractValue);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue readAbstractValueFromDataSource(DataSource source) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.readAbstractValueFromDataSource(source);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
String getCompactText(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.getCompactText(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isFixedLengthJsIndexable(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isFixedLengthJsIndexable(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isJsIndexableAndIterable(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isJsIndexableAndIterable(unwrapOrNull(value));
|
||||
|
||||
@override
|
||||
AbstractBool isJsIndexable(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isJsIndexable(value._abstractValue);
|
||||
|
||||
@override
|
||||
MemberEntity locateSingleMember(
|
||||
covariant PowersetValue receiver, Selector selector) =>
|
||||
_abstractValueDomain.locateSingleMember(
|
||||
receiver._abstractValue, selector);
|
||||
|
||||
@override
|
||||
AbstractBool isIn(
|
||||
covariant PowersetValue subset, covariant PowersetValue superset) =>
|
||||
_abstractValueDomain.isIn(subset._abstractValue, superset._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool needsNoSuchMethodHandling(
|
||||
covariant PowersetValue receiver, Selector selector) =>
|
||||
_abstractValueDomain.needsNoSuchMethodHandling(
|
||||
receiver._abstractValue, selector);
|
||||
|
||||
@override
|
||||
AbstractBool isTargetingMember(
|
||||
covariant PowersetValue receiver, MemberEntity member, Name name) =>
|
||||
_abstractValueDomain.isTargetingMember(
|
||||
receiver._abstractValue, member, name);
|
||||
|
||||
@override
|
||||
AbstractValue computeReceiver(Iterable<MemberEntity> members) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.computeReceiver(members);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
PrimitiveConstantValue getPrimitiveValue(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.getPrimitiveValue(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue createPrimitiveValue(
|
||||
covariant PowersetValue originalValue, PrimitiveConstantValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createPrimitiveValue(
|
||||
originalValue._abstractValue, value);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isPrimitiveValue(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitiveValue(value._abstractValue);
|
||||
|
||||
@override
|
||||
MemberEntity getAllocationElement(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.getAllocationElement(value._abstractValue);
|
||||
|
||||
@override
|
||||
Object getAllocationNode(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.getAllocationNode(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue getGeneralization(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.getGeneralization(unwrapOrNull(value));
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isSpecializationOf(covariant PowersetValue specialization,
|
||||
covariant PowersetValue generalization) =>
|
||||
_abstractValueDomain.isSpecializationOf(
|
||||
specialization._abstractValue, generalization._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue getDictionaryValueForKey(
|
||||
covariant PowersetValue value, String key) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.getDictionaryValueForKey(
|
||||
value._abstractValue, key);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool containsDictionaryKey(covariant PowersetValue value, String key) =>
|
||||
_abstractValueDomain.containsDictionaryKey(value._abstractValue, key);
|
||||
|
||||
@override
|
||||
AbstractValue createDictionaryValue(
|
||||
covariant PowersetValue originalValue,
|
||||
Object allocationNode,
|
||||
MemberEntity allocationElement,
|
||||
covariant PowersetValue key,
|
||||
covariant PowersetValue value,
|
||||
covariant Map<String, AbstractValue> mappings) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createDictionaryValue(
|
||||
originalValue._abstractValue,
|
||||
allocationNode,
|
||||
allocationElement,
|
||||
key._abstractValue,
|
||||
value._abstractValue, {
|
||||
for (var entry in mappings.entries)
|
||||
entry.key: (entry.value as PowersetValue)._abstractValue
|
||||
});
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isDictionary(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isDictionary(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue getMapValueType(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.getMapValueType(value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue getMapKeyType(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.getMapKeyType(value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createMapValue(
|
||||
covariant PowersetValue originalValue,
|
||||
Object allocationNode,
|
||||
MemberEntity allocationElement,
|
||||
covariant PowersetValue key,
|
||||
covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createMapValue(
|
||||
originalValue._abstractValue,
|
||||
allocationNode,
|
||||
allocationElement,
|
||||
key._abstractValue,
|
||||
value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isMap(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isMap(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue getSetElementType(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.getSetElementType(value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createSetValue(
|
||||
covariant PowersetValue originalValue,
|
||||
Object allocationNode,
|
||||
MemberEntity allocationElement,
|
||||
covariant PowersetValue elementType) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createSetValue(
|
||||
originalValue._abstractValue,
|
||||
allocationNode,
|
||||
allocationElement,
|
||||
elementType._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isSet(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isSet(value._abstractValue);
|
||||
|
||||
@override
|
||||
int getContainerLength(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.getContainerLength(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue getContainerElementType(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.getContainerElementType(value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createContainerValue(
|
||||
covariant PowersetValue originalValue,
|
||||
Object allocationNode,
|
||||
MemberEntity allocationElement,
|
||||
covariant PowersetValue elementType,
|
||||
int length) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createContainerValue(
|
||||
originalValue._abstractValue,
|
||||
allocationNode,
|
||||
allocationElement,
|
||||
elementType._abstractValue,
|
||||
length);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
bool isContainer(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isContainer(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue computeAbstractValueForConstant(covariant ConstantValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.computeAbstractValueForConstant(value);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue getAbstractValueForNativeMethodParameterType(DartType type) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.getAbstractValueForNativeMethodParameterType(type);
|
||||
return wrapOrNull(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractBool containsAll(covariant PowersetValue a) =>
|
||||
_abstractValueDomain.containsAll(a._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool areDisjoint(
|
||||
covariant PowersetValue a, covariant PowersetValue b) =>
|
||||
_abstractValueDomain.areDisjoint(a._abstractValue, b._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue intersection(
|
||||
covariant PowersetValue a, covariant PowersetValue b) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.intersection(a._abstractValue, b._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue unionOfMany(covariant Iterable<AbstractValue> values) {
|
||||
List<AbstractValue> unwrapped_Values = values
|
||||
.map((element) => (element as PowersetValue)._abstractValue)
|
||||
.toList();
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.unionOfMany(unwrapped_Values);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue union(covariant PowersetValue a, covariant PowersetValue b) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.union(a._abstractValue, b._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractBool isPrimitiveOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitiveOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isStringOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isStringOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isString(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isString(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isBooleanOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isBooleanOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isBoolean(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isBoolean(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isDoubleOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isDoubleOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isDouble(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isDouble(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isNumberOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isNumberOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isNumber(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isNumber(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isIntegerOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isIntegerOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPositiveIntegerOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPositiveIntegerOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPositiveInteger(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPositiveInteger(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isUInt31(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isUInt31(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isUInt32(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isUInt32(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isInteger(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isInteger(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isInterceptor(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isInterceptor(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPrimitiveString(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitiveString(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isMutableIndexable(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isMutableIndexable(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isMutableArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isMutableArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isExtendableArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isExtendableArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isFixedArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isFixedArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isIndexablePrimitive(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isIndexablePrimitive(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPrimitiveArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitiveArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPrimitiveBoolean(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitiveBoolean(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPrimitiveNumber(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitiveNumber(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isPrimitive(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isPrimitive(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
ClassEntity getExactClass(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.getExactClass(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isExactOrNull(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isExactOrNull(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isExact(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isExact(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isEmpty(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isEmpty(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isInstanceOf(covariant PowersetValue value, ClassEntity cls) =>
|
||||
_abstractValueDomain.isInstanceOf(value._abstractValue, cls);
|
||||
|
||||
@override
|
||||
AbstractBool isInstanceOfOrNull(
|
||||
covariant PowersetValue value, ClassEntity cls) =>
|
||||
_abstractValueDomain.isInstanceOfOrNull(value._abstractValue, cls);
|
||||
|
||||
@override
|
||||
AbstractBool containsOnlyType(
|
||||
covariant PowersetValue value, ClassEntity cls) =>
|
||||
_abstractValueDomain.containsOnlyType(value._abstractValue, cls);
|
||||
|
||||
@override
|
||||
AbstractBool containsType(covariant PowersetValue value, ClassEntity cls) =>
|
||||
_abstractValueDomain.containsType(value._abstractValue, cls);
|
||||
|
||||
@override
|
||||
AbstractValue includeNull(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.includeNull(value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue excludeNull(covariant PowersetValue value) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.excludeNull(value._abstractValue);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractBool couldBeTypedArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.couldBeTypedArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractBool isTypedArray(covariant PowersetValue value) =>
|
||||
_abstractValueDomain.isTypedArray(value._abstractValue);
|
||||
|
||||
@override
|
||||
AbstractValue createNullableSubtype(ClassEntity cls) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.createNullableSubtype(cls);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createNonNullSubtype(ClassEntity cls) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.createNonNullSubtype(cls);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createNonNullSubclass(ClassEntity cls) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue =
|
||||
_abstractValueDomain.createNonNullSubclass(cls);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createNullableExact(ClassEntity cls) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createNullableExact(cls);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue createNonNullExact(ClassEntity cls) {
|
||||
int powersetBits = 0;
|
||||
AbstractValue abstractValue = _abstractValueDomain.createNonNullExact(cls);
|
||||
return PowersetValue(abstractValue, powersetBits);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValueWithPrecision createFromStaticType(DartType type,
|
||||
{ClassRelation classRelation = ClassRelation.subtype, bool nullable}) {
|
||||
int powersetBits = 0;
|
||||
var unwrapped = _abstractValueDomain.createFromStaticType(type,
|
||||
classRelation: classRelation, nullable: nullable);
|
||||
return AbstractValueWithPrecision(
|
||||
PowersetValue(unwrapped.abstractValue, powersetBits),
|
||||
unwrapped.isPrecise);
|
||||
}
|
||||
|
||||
@override
|
||||
AbstractValue get asyncStarStreamType =>
|
||||
PowersetValue(_abstractValueDomain.asyncStarStreamType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get asyncFutureType =>
|
||||
PowersetValue(_abstractValueDomain.asyncFutureType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get syncStarIterableType =>
|
||||
PowersetValue(_abstractValueDomain.syncStarIterableType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get emptyType =>
|
||||
PowersetValue(_abstractValueDomain.emptyType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get constMapType =>
|
||||
PowersetValue(_abstractValueDomain.constMapType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get constSetType =>
|
||||
PowersetValue(_abstractValueDomain.constSetType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get constListType =>
|
||||
PowersetValue(_abstractValueDomain.constListType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get positiveIntType =>
|
||||
PowersetValue(_abstractValueDomain.positiveIntType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get uint32Type =>
|
||||
PowersetValue(_abstractValueDomain.uint32Type, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get uint31Type =>
|
||||
PowersetValue(_abstractValueDomain.uint31Type, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get fixedListType =>
|
||||
PowersetValue(_abstractValueDomain.fixedListType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get growableListType =>
|
||||
PowersetValue(_abstractValueDomain.growableListType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get nullType => PowersetValue(_abstractValueDomain.nullType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get nonNullType =>
|
||||
PowersetValue(_abstractValueDomain.nonNullType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get mapType => PowersetValue(_abstractValueDomain.mapType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get setType => PowersetValue(_abstractValueDomain.setType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get listType => PowersetValue(_abstractValueDomain.listType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get stringType =>
|
||||
PowersetValue(_abstractValueDomain.stringType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get numType => PowersetValue(_abstractValueDomain.numType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get doubleType =>
|
||||
PowersetValue(_abstractValueDomain.doubleType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get intType => PowersetValue(_abstractValueDomain.intType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get boolType => PowersetValue(_abstractValueDomain.boolType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get functionType =>
|
||||
PowersetValue(_abstractValueDomain.functionType, 0);
|
||||
|
||||
@override
|
||||
AbstractValue get typeType => PowersetValue(_abstractValueDomain.typeType, 0);
|
||||
}
|
||||
|
||||
class PowersetStrategy implements AbstractValueStrategy {
|
||||
final AbstractValueStrategy _abstractValueStrategy;
|
||||
const PowersetStrategy(this._abstractValueStrategy);
|
||||
|
||||
@override
|
||||
AbstractValueDomain createDomain(JClosedWorld closedWorld) {
|
||||
return PowersetDomain(_abstractValueStrategy.createDomain(closedWorld));
|
||||
}
|
||||
|
||||
@override
|
||||
SelectorConstraintsStrategy createSelectorStrategy() {
|
||||
return PowersetsSelectorStrategy(
|
||||
_abstractValueStrategy.createSelectorStrategy());
|
||||
}
|
||||
}
|
||||
|
||||
class PowersetsSelectorStrategy implements SelectorConstraintsStrategy {
|
||||
final SelectorConstraintsStrategy _selectorConstraintsStrategy;
|
||||
const PowersetsSelectorStrategy(this._selectorConstraintsStrategy);
|
||||
|
||||
@override
|
||||
UniverseSelectorConstraints createSelectorConstraints(
|
||||
Selector selector, Object initialConstraint) {
|
||||
return PowersetsUniverseSelectorConstraints(
|
||||
_selectorConstraintsStrategy.createSelectorConstraints(
|
||||
selector,
|
||||
initialConstraint == null
|
||||
? null
|
||||
: (initialConstraint as PowersetValue)._abstractValue));
|
||||
}
|
||||
|
||||
@override
|
||||
bool appliedUnnamed(DynamicUse dynamicUse, MemberEntity member,
|
||||
covariant JClosedWorld world) {
|
||||
return _selectorConstraintsStrategy.appliedUnnamed(
|
||||
dynamicUse.withReceiverConstraint(
|
||||
unwrapOrNull(dynamicUse.receiverConstraint)),
|
||||
member,
|
||||
world);
|
||||
}
|
||||
}
|
||||
|
||||
class PowersetsUniverseSelectorConstraints
|
||||
implements UniverseSelectorConstraints {
|
||||
final UniverseSelectorConstraints _universeSelectorConstraints;
|
||||
const PowersetsUniverseSelectorConstraints(this._universeSelectorConstraints);
|
||||
|
||||
@override
|
||||
bool addReceiverConstraint(Object constraint) =>
|
||||
_universeSelectorConstraints.addReceiverConstraint(constraint == null
|
||||
? null
|
||||
: (constraint as PowersetValue)._abstractValue);
|
||||
|
||||
@override
|
||||
bool needsNoSuchMethodHandling(Selector selector, World world) =>
|
||||
_universeSelectorConstraints.needsNoSuchMethodHandling(selector, world);
|
||||
|
||||
@override
|
||||
bool canHit(MemberEntity element, Name name, World world) =>
|
||||
_universeSelectorConstraints.canHit(element, name, world);
|
||||
|
||||
@override
|
||||
String toString() => 'PowersetsUniverseSelectorConstraints:$hashCode';
|
||||
}
|
|
@ -198,7 +198,10 @@ class CompilerOptions implements DiagnosticOptions {
|
|||
/// Whether to use the trivial abstract value domain.
|
||||
bool useTrivialAbstractValueDomain = false;
|
||||
|
||||
/// Whether to use the powerset abstract value domain (experimental).
|
||||
/// Whether to use the wrapped abstract value domain (experimental).
|
||||
bool experimentalWrapped = false;
|
||||
|
||||
/// Whether to use the powersets abstract value domain (experimental).
|
||||
bool experimentalPowersets = false;
|
||||
|
||||
/// Whether to disable optimization for need runtime type information.
|
||||
|
@ -445,6 +448,7 @@ class CompilerOptions implements DiagnosticOptions {
|
|||
..disableTypeInference = _hasOption(options, Flags.disableTypeInference)
|
||||
..useTrivialAbstractValueDomain =
|
||||
_hasOption(options, Flags.useTrivialAbstractValueDomain)
|
||||
..experimentalWrapped = _hasOption(options, Flags.experimentalWrapped)
|
||||
..experimentalPowersets = _hasOption(options, Flags.experimentalPowersets)
|
||||
..disableRtiOptimization =
|
||||
_hasOption(options, Flags.disableRtiOptimization)
|
||||
|
|
Loading…
Reference in a new issue