[dart2js] Prep ssa/builder.dart for null safety migration.
Change-Id: I7ff792c38bd2257bcff55186e9f6f0cabf5f9021
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/277160
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Nate Biggs <natebiggs@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index 8b79e54..7ddfa0b 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -168,18 +168,18 @@
/// Returns the inferred receiver type of the dynamic [invocation].
// TODO(johnniwinther): Improve the type of the [invocation] once the new
// method invocation encoding is fully utilized.
- AbstractValue receiverTypeOfInvocation(
+ AbstractValue? receiverTypeOfInvocation(
ir.Expression invocation, AbstractValueDomain abstractValueDomain);
/// Returns the inferred receiver type of the dynamic [read].
// TODO(johnniwinther): Improve the type of the [invocation] once the new
// method invocation encoding is fully utilized.
- AbstractValue receiverTypeOfGet(ir.Expression read);
+ AbstractValue? receiverTypeOfGet(ir.Expression read);
/// Returns the inferred receiver type of the dynamic [write].
// TODO(johnniwinther): Improve the type of the [invocation] once the new
// method invocation encoding is fully utilized.
- AbstractValue receiverTypeOfSet(
+ AbstractValue? receiverTypeOfSet(
ir.Expression write, AbstractValueDomain abstractValueDomain);
/// Returns the inferred type of [listLiteral].
@@ -187,13 +187,13 @@
ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain);
/// Returns the inferred type of iterator in [forInStatement].
- AbstractValue typeOfIterator(ir.ForInStatement forInStatement);
+ AbstractValue? typeOfIterator(ir.ForInStatement forInStatement);
/// Returns the inferred type of `current` in [forInStatement].
- AbstractValue typeOfIteratorCurrent(ir.ForInStatement forInStatement);
+ AbstractValue? typeOfIteratorCurrent(ir.ForInStatement forInStatement);
/// Returns the inferred type of `moveNext` in [forInStatement].
- AbstractValue typeOfIteratorMoveNext(ir.ForInStatement forInStatement);
+ AbstractValue? typeOfIteratorMoveNext(ir.ForInStatement forInStatement);
/// Returns `true` if [forInStatement] is inferred to be a JavaScript
/// indexable iterator.
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 9186746..8ebe6c8 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -6,8 +6,6 @@
library dart2js.js_model.strategy;
-import 'package:kernel/ast.dart' as ir;
-
import '../common.dart';
import '../common/codegen.dart';
import '../common/elements.dart' show CommonElements, ElementEnvironment;
@@ -22,7 +20,6 @@
import '../io/kernel_source_information.dart'
show KernelSourceInformationStrategy;
import '../io/source_information.dart';
-import '../inferrer/abstract_value_domain.dart';
import '../inferrer/type_graph_inferrer.dart';
import '../inferrer/types.dart';
import '../inferrer_experimental/types.dart' as experimentalInferrer;
@@ -56,7 +53,6 @@
import '../js/js.dart' as js;
import '../kernel/kernel_strategy.dart';
import '../kernel/kernel_world.dart';
-import '../native/behavior.dart';
import '../native/enqueue.dart';
import '../options.dart';
import '../serialization/serialization.dart';
@@ -64,10 +60,8 @@
import '../ssa/metrics.dart';
import '../ssa/nodes.dart';
import '../ssa/ssa.dart';
-import '../ssa/types.dart';
import '../tracer.dart';
import '../universe/codegen_world_builder.dart';
-import '../universe/selector.dart';
import '../universe/world_impact.dart';
import 'closure.dart';
import 'element_map.dart';
@@ -556,103 +550,3 @@
});
}
}
-
-class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap {
- final GlobalTypeInferenceResults _globalInferenceResults;
- GlobalTypeInferenceMemberResult _targetResults;
-
- KernelToTypeInferenceMapImpl(
- MemberEntity target, this._globalInferenceResults) {
- _targetResults = _resultOf(target);
- }
-
- GlobalTypeInferenceMemberResult _resultOf(MemberEntity e) =>
- _globalInferenceResults
- .resultOfMember(e is ConstructorBodyEntity ? e.constructor : e);
-
- @override
- AbstractValue getReturnTypeOf(FunctionEntity function) {
- return AbstractValueFactory.inferredReturnTypeForElement(
- function, _globalInferenceResults);
- }
-
- @override
- AbstractValue receiverTypeOfInvocation(
- ir.Expression node, AbstractValueDomain abstractValueDomain) {
- return _targetResults.typeOfReceiver(node);
- }
-
- @override
- AbstractValue receiverTypeOfGet(ir.Expression node) {
- return _targetResults.typeOfReceiver(node);
- }
-
- @override
- AbstractValue receiverTypeOfSet(
- ir.Expression node, AbstractValueDomain abstractValueDomain) {
- return _targetResults.typeOfReceiver(node);
- }
-
- @override
- AbstractValue typeOfListLiteral(
- ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain) {
- return _globalInferenceResults.typeOfListLiteral(listLiteral) ??
- abstractValueDomain.dynamicType;
- }
-
- @override
- AbstractValue typeOfIterator(ir.ForInStatement node) {
- return _targetResults.typeOfIterator(node);
- }
-
- @override
- AbstractValue typeOfIteratorCurrent(ir.ForInStatement node) {
- return _targetResults.typeOfIteratorCurrent(node);
- }
-
- @override
- AbstractValue typeOfIteratorMoveNext(ir.ForInStatement node) {
- return _targetResults.typeOfIteratorMoveNext(node);
- }
-
- @override
- bool isJsIndexableIterator(
- ir.ForInStatement node, AbstractValueDomain abstractValueDomain) {
- AbstractValue mask = typeOfIterator(node);
- // TODO(sra): Investigate why mask is sometimes null.
- if (mask == null) return false;
- return abstractValueDomain.isJsIndexableAndIterable(mask).isDefinitelyTrue;
- }
-
- @override
- AbstractValue inferredIndexType(ir.ForInStatement node) {
- return AbstractValueFactory.inferredResultTypeForSelector(
- Selector.index(), typeOfIterator(node), _globalInferenceResults);
- }
-
- @override
- AbstractValue getInferredTypeOf(MemberEntity member) {
- return AbstractValueFactory.inferredTypeForMember(
- member, _globalInferenceResults);
- }
-
- @override
- AbstractValue getInferredTypeOfParameter(Local parameter) {
- return AbstractValueFactory.inferredTypeForParameter(
- parameter, _globalInferenceResults);
- }
-
- @override
- AbstractValue resultTypeOfSelector(Selector selector, AbstractValue mask) {
- return AbstractValueFactory.inferredResultTypeForSelector(
- selector, mask, _globalInferenceResults);
- }
-
- @override
- AbstractValue typeFromNativeBehavior(
- // TODO(48820): remove covariant once interface and implementation match.
- NativeBehavior nativeBehavior,
- covariant JClosedWorld closedWorld) {
- return AbstractValueFactory.fromNativeBehavior(nativeBehavior, closedWorld);
- }
-}
diff --git a/pkg/compiler/lib/src/js_model/js_strategy_migrated.dart b/pkg/compiler/lib/src/js_model/js_strategy_migrated.dart
new file mode 100644
index 0000000..82f38506
--- /dev/null
+++ b/pkg/compiler/lib/src/js_model/js_strategy_migrated.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2022, 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 'package:kernel/ast.dart' as ir;
+
+import '../elements/entities.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
+import '../native/behavior.dart';
+import '../ssa/types.dart';
+import '../universe/selector.dart';
+import 'element_map.dart';
+import 'js_world.dart';
+
+class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap {
+ final GlobalTypeInferenceResults _globalInferenceResults;
+ late final GlobalTypeInferenceMemberResult _targetResults;
+
+ KernelToTypeInferenceMapImpl(
+ MemberEntity target, this._globalInferenceResults) {
+ _targetResults = _resultOf(target);
+ }
+
+ GlobalTypeInferenceMemberResult _resultOf(MemberEntity e) =>
+ _globalInferenceResults
+ .resultOfMember(e is ConstructorBodyEntity ? e.constructor : e);
+
+ @override
+ AbstractValue getReturnTypeOf(FunctionEntity function) {
+ return AbstractValueFactory.inferredReturnTypeForElement(
+ function, _globalInferenceResults);
+ }
+
+ @override
+ AbstractValue? receiverTypeOfInvocation(
+ ir.Expression node, AbstractValueDomain abstractValueDomain) {
+ return _targetResults.typeOfReceiver(node);
+ }
+
+ @override
+ AbstractValue? receiverTypeOfGet(ir.Expression node) {
+ return _targetResults.typeOfReceiver(node);
+ }
+
+ @override
+ AbstractValue? receiverTypeOfSet(
+ ir.Expression node, AbstractValueDomain abstractValueDomain) {
+ return _targetResults.typeOfReceiver(node);
+ }
+
+ @override
+ AbstractValue typeOfListLiteral(
+ ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain) {
+ return _globalInferenceResults.typeOfListLiteral(listLiteral) ??
+ abstractValueDomain.dynamicType;
+ }
+
+ @override
+ AbstractValue? typeOfIterator(ir.ForInStatement node) {
+ return _targetResults.typeOfIterator(node);
+ }
+
+ @override
+ AbstractValue? typeOfIteratorCurrent(ir.ForInStatement node) {
+ return _targetResults.typeOfIteratorCurrent(node);
+ }
+
+ @override
+ AbstractValue? typeOfIteratorMoveNext(ir.ForInStatement node) {
+ return _targetResults.typeOfIteratorMoveNext(node);
+ }
+
+ @override
+ bool isJsIndexableIterator(
+ ir.ForInStatement node, AbstractValueDomain abstractValueDomain) {
+ final mask = typeOfIterator(node);
+ // TODO(sra): Investigate why mask is sometimes null.
+ if (mask == null) return false;
+ return abstractValueDomain.isJsIndexableAndIterable(mask).isDefinitelyTrue;
+ }
+
+ @override
+ AbstractValue inferredIndexType(ir.ForInStatement node) {
+ return AbstractValueFactory.inferredResultTypeForSelector(
+ Selector.index(), typeOfIterator(node)!, _globalInferenceResults);
+ }
+
+ @override
+ AbstractValue getInferredTypeOf(MemberEntity member) {
+ return AbstractValueFactory.inferredTypeForMember(
+ member, _globalInferenceResults);
+ }
+
+ @override
+ AbstractValue getInferredTypeOfParameter(Local parameter) {
+ return AbstractValueFactory.inferredTypeForParameter(
+ parameter, _globalInferenceResults);
+ }
+
+ @override
+ AbstractValue resultTypeOfSelector(Selector selector, AbstractValue mask) {
+ return AbstractValueFactory.inferredResultTypeForSelector(
+ selector, mask, _globalInferenceResults);
+ }
+
+ @override
+ AbstractValue typeFromNativeBehavior(
+ // TODO(48820): remove covariant once interface and implementation match.
+ NativeBehavior nativeBehavior,
+ covariant JClosedWorld closedWorld) {
+ return AbstractValueFactory.fromNativeBehavior(nativeBehavior, closedWorld);
+ }
+}
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index d65a3ab..a878ba5c 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -42,7 +42,7 @@
import '../js_model/class_type_variable_access.dart';
import '../js_model/element_map.dart';
import '../js_model/elements.dart' show JGeneratorBody;
-import '../js_model/js_strategy.dart';
+import '../js_model/js_strategy_migrated.dart';
import '../js_model/js_world.dart' show JClosedWorld;
import '../js_model/locals.dart' show GlobalLocalsMap, JumpVisitor;
import '../js_model/type_recipe.dart';
@@ -265,7 +265,7 @@
/// The current block to add instructions to. Might be null, if we are
/// visiting dead code, but see [_isReachable].
@override
- HBasicBlock get current => _current /*!*/;
+ HBasicBlock get current => _current;
void set current(c) {
_isReachable = c != null;