Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ccd063b

Browse files
alexmarkovcommit-bot@chromium.org
authored andcommitted
Migrate pkg/vm to null safety, part 3
TEST=ci Issue: dart-lang/sdk#46620 Change-Id: I1ab793eec6ffd7e01cee1e6641138e96a4f4d9fc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/207864 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
1 parent f4d3f80 commit ccd063b

File tree

14 files changed

+795
-837
lines changed

14 files changed

+795
-837
lines changed

pkg/vm/lib/transformations/type_flow/analysis.dart

Lines changed: 141 additions & 133 deletions
Large diffs are not rendered by default.

pkg/vm/lib/transformations/type_flow/calls.dart

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// @dart=2.9
6-
75
/// Declares classes which describe a call: selectors and arguments.
8-
library vm.transformations.type_flow.calls;
96
107
import 'dart:core' hide Type;
118

@@ -30,10 +27,10 @@ abstract class Selector {
3027
Selector(this.callKind);
3128

3229
/// Interface or concrete target, may be null.
33-
Member get member;
30+
Member? get member;
3431

3532
/// Selector name.
36-
Name get name => member.name;
33+
Name get name => member!.name;
3734

3835
bool get isSetter => (callKind == CallKind.PropertySet);
3936

@@ -46,6 +43,7 @@ abstract class Selector {
4643

4744
/// Static approximation of Dart return type.
4845
DartType get staticReturnType {
46+
final member = this.member;
4947
if (member == null) {
5048
return const DynamicType();
5149
}
@@ -61,7 +59,6 @@ abstract class Selector {
6159
case CallKind.SetFieldInConstructor:
6260
return const NeverType.nonNullable();
6361
}
64-
return null;
6562
}
6663

6764
bool memberAgreesToCallKind(Member member) {
@@ -79,7 +76,6 @@ abstract class Selector {
7976
case CallKind.SetFieldInConstructor:
8077
return member is Field;
8178
}
82-
return false;
8379
}
8480

8581
String get _callKindPrefix {
@@ -94,7 +90,6 @@ abstract class Selector {
9490
case CallKind.FieldInitializer:
9591
return 'init ';
9692
}
97-
return '';
9893
}
9994
}
10095

@@ -169,7 +164,7 @@ class DynamicSelector extends Selector {
169164
DynamicSelector(CallKind callKind, this.name) : super(callKind);
170165

171166
@override
172-
Member get member => null;
167+
Member? get member => null;
173168

174169
@override
175170
int get hashCode => (super.hashCode ^ name.hashCode + 37) & kHashMask;
@@ -189,7 +184,8 @@ class Args<T extends TypeExpr> {
189184
final List<T> values;
190185
final List<String> names;
191186

192-
int _hashCode;
187+
@override
188+
late final int hashCode = _computeHashCode();
193189

194190
Args(this.values, {this.names = const <String>[]}) {
195191
assert(isSorted(names));
@@ -206,9 +202,6 @@ class Args<T extends TypeExpr> {
206202

207203
T get receiver => values[0];
208204

209-
@override
210-
int get hashCode => _hashCode ??= _computeHashCode();
211-
212205
int _computeHashCode() {
213206
int hash = 1231;
214207
for (var v in values) {

pkg/vm/lib/transformations/type_flow/native_code.dart

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// @dart=2.9
6-
75
/// Handling of native code and entry points.
8-
library vm.transformations.type_flow.native_code;
96
107
import 'dart:core' hide Type;
118

@@ -35,24 +32,21 @@ abstract class EntryPointsListener {
3532
/// Record the fact that given member is called from this.
3633
void recordMemberCalledViaThis(Member target);
3734

38-
/// Record the fact that given method is torn off.
39-
void recordTearOff(Procedure target) {}
35+
/// Record the fact that given member is torn off.
36+
void recordTearOff(Member target) {}
4037
}
4138

4239
class PragmaEntryPointsVisitor extends RecursiveVisitor {
4340
final EntryPointsListener entryPoints;
4441
final NativeCodeOracle nativeCodeOracle;
4542
final PragmaAnnotationParser matcher;
46-
Class currentClass = null;
4743

4844
PragmaEntryPointsVisitor(
49-
this.entryPoints, this.nativeCodeOracle, this.matcher) {
50-
assert(matcher != null);
51-
}
45+
this.entryPoints, this.nativeCodeOracle, this.matcher);
5246

53-
PragmaEntryPointType _annotationsDefineRoot(List<Expression> annotations) {
47+
PragmaEntryPointType? _annotationsDefineRoot(List<Expression> annotations) {
5448
for (var annotation in annotations) {
55-
ParsedPragma pragma = matcher.parsePragma(annotation);
49+
ParsedPragma? pragma = matcher.parsePragma(annotation);
5650
if (pragma == null) continue;
5751
if (pragma is ParsedEntryPointPragma) return pragma.type;
5852
}
@@ -72,7 +66,6 @@ class PragmaEntryPointsVisitor extends RecursiveVisitor {
7266
}
7367
nativeCodeOracle.addClassReferencedFromNativeCode(klass);
7468
}
75-
currentClass = klass;
7669
klass.visitChildren(this);
7770
}
7871

@@ -88,8 +81,7 @@ class PragmaEntryPointsVisitor extends RecursiveVisitor {
8881
}
8982
Member target = proc;
9083
while (target is Procedure && target.isRedirectingFactory) {
91-
target = getRedirectingFactoryBody(target).target;
92-
assert(target != null);
84+
target = getRedirectingFactoryBody(target)!.target!;
9385
assert(
9486
(target is Procedure && target.isFactory) || target is Constructor);
9587
}
@@ -152,7 +144,7 @@ class PragmaEntryPointsVisitor extends RecursiveVisitor {
152144
}
153145
entryPoints
154146
.addRawCall(new DirectSelector(ctor, callKind: CallKind.Method));
155-
entryPoints.addAllocatedClass(currentClass);
147+
entryPoints.addAllocatedClass(ctor.enclosingClass);
156148
nativeCodeOracle.setMemberReferencedFromNativeCode(ctor);
157149
}
158150
}
@@ -201,9 +193,7 @@ class NativeCodeOracle {
201193
final Set<Class> _classesReferencedFromNativeCode = new Set<Class>();
202194
final PragmaAnnotationParser _matcher;
203195

204-
NativeCodeOracle(this._libraryIndex, this._matcher) {
205-
assert(_matcher != null);
206-
}
196+
NativeCodeOracle(this._libraryIndex, this._matcher);
207197

208198
void addClassReferencedFromNativeCode(Class klass) {
209199
_classesReferencedFromNativeCode.add(klass);
@@ -219,25 +209,26 @@ class NativeCodeOracle {
219209
bool isMemberReferencedFromNativeCode(Member member) =>
220210
_membersReferencedFromNativeCode.contains(member);
221211

222-
PragmaRecognizedType recognizedType(Member member) {
212+
PragmaRecognizedType? recognizedType(Member member) {
223213
for (var annotation in member.annotations) {
224-
ParsedPragma pragma = _matcher.parsePragma(annotation);
214+
ParsedPragma? pragma = _matcher.parsePragma(annotation);
225215
if (pragma is ParsedRecognized) {
226216
return pragma.type;
227217
}
228218
}
229219
return null;
230220
}
231221

232-
bool isRecognized(Member member, [List<PragmaRecognizedType> expectedTypes]) {
233-
PragmaRecognizedType type = recognizedType(member);
222+
bool isRecognized(Member member,
223+
[List<PragmaRecognizedType>? expectedTypes]) {
224+
PragmaRecognizedType? type = recognizedType(member);
234225
return type != null &&
235226
(expectedTypes == null || expectedTypes.contains(type));
236227
}
237228

238229
bool hasDisableUnboxedParameters(Member member) {
239230
for (var annotation in member.annotations) {
240-
ParsedPragma pragma = _matcher.parsePragma(annotation);
231+
ParsedPragma? pragma = _matcher.parsePragma(annotation);
241232
if (pragma is ParsedDisableUnboxedParameters) {
242233
if (member.enclosingLibrary.importUri.scheme != "dart") {
243234
throw "ERROR: Cannot use @pragma(vm:disable-unboxed-parameters) outside core libraries.";
@@ -255,11 +246,11 @@ class NativeCodeOracle {
255246
EntryPointsListener entryPointsListener,
256247
TypesBuilder typesBuilder,
257248
RuntimeTypeTranslator translator) {
258-
TypeExpr returnType = null;
259-
bool nullable = null;
249+
TypeExpr? returnType = null;
250+
bool? nullable = null;
260251

261252
for (var annotation in member.annotations) {
262-
ParsedPragma pragma = _matcher.parsePragma(annotation);
253+
ParsedPragma? pragma = _matcher.parsePragma(annotation);
263254
if (pragma == null) continue;
264255
if (pragma is ParsedResultTypeByTypePragma ||
265256
pragma is ParsedResultTypeByPathPragma ||
@@ -278,8 +269,8 @@ class NativeCodeOracle {
278269
returnType = entryPointsListener.addAllocatedClass(type.classNode);
279270
if (pragma.resultTypeUsesPassedTypeArguments) {
280271
returnType = translator.instantiateConcreteType(
281-
returnType,
282-
member.function.typeParameters
272+
returnType as ConcreteType,
273+
member.function!.typeParameters
283274
.map((t) => TypeParameterType(
284275
t, TypeParameterType.computeNullabilityFromBound(t)))
285276
.toList());
@@ -314,7 +305,7 @@ class NativeCodeOracle {
314305
return returnType;
315306
} else {
316307
return typesBuilder.fromStaticType(
317-
member.function.returnType, nullable ?? true);
308+
member.function!.returnType, nullable ?? true);
318309
}
319310
}
320311
}

pkg/vm/lib/transformations/type_flow/protobuf_handler.dart

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
// @dart=2.9
6-
75
import 'package:kernel/ast.dart';
86
import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
97
import 'package:kernel/core_types.dart' show CoreTypes;
@@ -47,14 +45,14 @@ class ProtobufHandler {
4745
final Procedure _builderInfoAddMethod;
4846

4947
// Type of BuilderInfo.add<Null>().
50-
FunctionType _typeOfBuilderInfoAddOfNull;
48+
late FunctionType _typeOfBuilderInfoAddOfNull;
5149

5250
final _messageClasses = <Class, _MessageClass>{};
5351
final _invalidatedClasses = <_MessageClass>{};
5452

5553
/// Creates [ProtobufHandler] instance for [component].
5654
/// Returns null if protobuf library is not used.
57-
static ProtobufHandler forComponent(
55+
static ProtobufHandler? forComponent(
5856
Component component, CoreTypes coreTypes) {
5957
final libraryIndex = LibraryIndex(component, [protobufLibraryUri]);
6058
if (!libraryIndex.containsLibrary(protobufLibraryUri)) {
@@ -68,12 +66,12 @@ class ProtobufHandler {
6866
libraryIndex.getClass(protobufLibraryUri, 'GeneratedMessage'),
6967
_tagNumberClass =
7068
libraryIndex.getClass(protobufLibraryUri, 'TagNumber'),
71-
_tagNumberField = libraryIndex.getMember(
72-
protobufLibraryUri, 'TagNumber', 'tagNumber'),
69+
_tagNumberField =
70+
libraryIndex.getField(protobufLibraryUri, 'TagNumber', 'tagNumber'),
7371
_builderInfoClass =
7472
libraryIndex.getClass(protobufLibraryUri, 'BuilderInfo'),
75-
_builderInfoAddMethod =
76-
libraryIndex.getMember(protobufLibraryUri, 'BuilderInfo', 'add') {
73+
_builderInfoAddMethod = libraryIndex.getProcedure(
74+
protobufLibraryUri, 'BuilderInfo', 'add') {
7775
final functionType = _builderInfoAddMethod.getterType as FunctionType;
7876
_typeOfBuilderInfoAddOfNull = Substitution.fromPairs(
7977
functionType.typeParameters, const <DartType>[NullType()])
@@ -130,8 +128,9 @@ class ProtobufHandler {
130128
List<Field> getInvalidatedFields() {
131129
final fields = <Field>[];
132130
for (var cls in _invalidatedClasses) {
133-
if (cls._metadataField != null) {
134-
fields.add(cls._metadataField);
131+
final field = cls._metadataField;
132+
if (field != null) {
133+
fields.add(field);
135134
}
136135
}
137136
_invalidatedClasses.clear();
@@ -143,14 +142,15 @@ class ProtobufHandler {
143142
++Statistics.protobufMetadataInitializersUpdated;
144143
Statistics.protobufMetadataFieldsPruned -= cls.numberOfFieldsPruned;
145144

146-
final field = cls._metadataField;
147-
if (cls._originalInitializer == null) {
148-
cls._originalInitializer = field.initializer;
145+
final field = cls._metadataField!;
146+
Expression? originalInitializer = cls._originalInitializer;
147+
if (originalInitializer == null) {
148+
cls._originalInitializer = originalInitializer = field.initializer!;
149149
}
150150
final cloner = CloneVisitorNotMembers();
151-
field.initializer = cloner.clone(cls._originalInitializer)..parent = field;
151+
field.initializer = cloner.clone(originalInitializer)..parent = field;
152152
final transformer = _MetadataTransformer(this, cls);
153-
field.initializer.accept(transformer);
153+
field.initializer!.accept(transformer);
154154
_invalidatedClasses.remove(cls);
155155

156156
cls.numberOfFieldsPruned = transformer.numberOfFieldsPruned;
@@ -168,8 +168,8 @@ class ProtobufHandler {
168168
}
169169

170170
class _MessageClass {
171-
Field _metadataField;
172-
Expression _originalInitializer;
171+
Field? _metadataField;
172+
Expression? _originalInitializer;
173173
final _usedTags = <int>{};
174174
int numberOfFieldsPruned = 0;
175175
}

0 commit comments

Comments
 (0)