Skip to content

Commit f743594

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
Handle flags at member level
Change-Id: I5fa438789fc1ac52007efeb6ada607f5c51ec037 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/108401 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Stephen Adams <[email protected]>
1 parent 8f90265 commit f743594

27 files changed

+635
-514
lines changed

pkg/compiler/lib/src/common/codegen.dart

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class CodegenImpact extends WorldImpact {
6868
class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
6969
static const String tag = 'codegen-impact';
7070

71+
@override
72+
final MemberEntity member;
7173
Set<Pair<DartType, DartType>> _typeVariableBoundsSubtypeChecks;
7274
Set<String> _constSymbols;
7375
List<Set<ClassEntity>> _specializedGetInterceptors;
@@ -78,9 +80,10 @@ class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
7880
Set<FunctionEntity> _nativeMethods;
7981
Set<Selector> _oneShotInterceptors;
8082

81-
_CodegenImpact();
83+
_CodegenImpact(this.member);
8284

8385
_CodegenImpact.internal(
86+
this.member,
8487
Set<DynamicUse> dynamicUses,
8588
Set<StaticUse> staticUses,
8689
Set<TypeUse> typeUses,
@@ -98,6 +101,7 @@ class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
98101

99102
factory _CodegenImpact.readFromDataSource(DataSource source) {
100103
source.begin(tag);
104+
MemberEntity member = source.readMember();
101105
Set<DynamicUse> dynamicUses = source
102106
.readList(() => DynamicUse.readFromDataSource(source),
103107
emptyAsNull: true)
@@ -139,6 +143,7 @@ class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
139143
?.toSet();
140144
source.end(tag);
141145
return new _CodegenImpact.internal(
146+
member,
142147
dynamicUses,
143148
staticUses,
144149
typeUses,
@@ -157,6 +162,7 @@ class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
157162
@override
158163
void writeToDataSink(DataSink sink) {
159164
sink.begin(tag);
165+
sink.writeMember(member);
160166
sink.writeList(dynamicUses, (DynamicUse use) => use.writeToDataSink(sink),
161167
allowNull: true);
162168
sink.writeList(staticUses, (StaticUse use) => use.writeToDataSink(sink),
@@ -192,9 +198,11 @@ class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
192198

193199
@override
194200
void apply(WorldImpactVisitor visitor) {
195-
staticUses.forEach(visitor.visitStaticUse);
196-
dynamicUses.forEach(visitor.visitDynamicUse);
197-
typeUses.forEach(visitor.visitTypeUse);
201+
staticUses.forEach((StaticUse use) => visitor.visitStaticUse(member, use));
202+
dynamicUses.forEach((DynamicUse use) => visitor.visitDynamicUse);
203+
typeUses.forEach((TypeUse use) => visitor.visitTypeUse(member, use));
204+
constantUses
205+
.forEach((ConstantUse use) => visitor.visitConstantUse(member, use));
198206
}
199207

200208
void registerTypeVariableBoundsSubtypeCheck(
@@ -331,7 +339,7 @@ class CodegenRegistry {
331339
List<ModularExpression> _expressions;
332340

333341
CodegenRegistry(this._elementEnvironment, this._currentElement)
334-
: this._worldImpact = new _CodegenImpact();
342+
: this._worldImpact = new _CodegenImpact(_currentElement);
335343

336344
@override
337345
String toString() => 'CodegenRegistry for $_currentElement';

pkg/compiler/lib/src/deferred_load.dart

Lines changed: 67 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,14 @@ abstract class DeferredLoadTask extends CompilerTask {
179179
///
180180
/// The collected dependent elements and constants are are added to
181181
/// [elements] and [constants] respectively.
182-
void _collectDirectMemberDependencies(
182+
void _collectDirectMemberDependencies(KClosedWorld closedWorld,
183183
MemberEntity element, Dependencies dependencies) {
184184
// TODO(sigurdm): We want to be more specific about this - need a better
185185
// way to query "liveness".
186186
if (!compiler.resolutionWorldBuilder.isMemberUsed(element)) {
187187
return;
188188
}
189-
_collectDependenciesFromImpact(element, dependencies);
189+
_collectDependenciesFromImpact(closedWorld, element, dependencies);
190190
collectConstantsInBody(element, dependencies);
191191
}
192192

@@ -195,15 +195,17 @@ abstract class DeferredLoadTask extends CompilerTask {
195195
///
196196
/// Adds the results to [elements] and [constants].
197197
void _collectAllElementsAndConstantsResolvedFromClass(
198-
ClassEntity element, Dependencies dependencies) {
198+
KClosedWorld closedWorld,
199+
ClassEntity element,
200+
Dependencies dependencies) {
199201
// If we see a class, add everything its live instance members refer
200202
// to. Static members are not relevant, unless we are processing
201203
// extra dependencies due to mirrors.
202204
void addLiveInstanceMember(MemberEntity member) {
203205
if (!compiler.resolutionWorldBuilder.isMemberUsed(member)) return;
204206
if (!member.isInstanceMember) return;
205207
dependencies.addMember(member);
206-
_collectDirectMemberDependencies(member, dependencies);
208+
_collectDirectMemberDependencies(closedWorld, member, dependencies);
207209
}
208210

209211
ClassEntity cls = element;
@@ -219,21 +221,24 @@ abstract class DeferredLoadTask extends CompilerTask {
219221
///
220222
/// Adds the results to [elements] and [constants].
221223
void _collectAllElementsAndConstantsResolvedFromMember(
222-
MemberEntity element, Dependencies dependencies) {
224+
KClosedWorld closedWorld,
225+
MemberEntity element,
226+
Dependencies dependencies) {
223227
if (element is FunctionEntity) {
224228
_collectTypeDependencies(
225229
elementEnvironment.getFunctionType(element), dependencies);
226230
}
227231
if (element.isStatic || element.isTopLevel || element.isConstructor) {
228232
dependencies.addMember(element);
229-
_collectDirectMemberDependencies(element, dependencies);
233+
_collectDirectMemberDependencies(closedWorld, element, dependencies);
230234
}
231235
if (element is ConstructorEntity && element.isGenerativeConstructor) {
232236
// When instantiating a class, we record a reference to the
233237
// constructor, not the class itself. We must add all the
234238
// instance members of the constructor's class.
235239
ClassEntity cls = element.enclosingClass;
236-
_collectAllElementsAndConstantsResolvedFromClass(cls, dependencies);
240+
_collectAllElementsAndConstantsResolvedFromClass(
241+
closedWorld, cls, dependencies);
237242
}
238243

239244
// Other elements, in particular instance members, are ignored as
@@ -265,13 +270,14 @@ abstract class DeferredLoadTask extends CompilerTask {
265270
}
266271

267272
/// Extract any dependencies that are known from the impact of [element].
268-
void _collectDependenciesFromImpact(
273+
void _collectDependenciesFromImpact(KClosedWorld closedWorld,
269274
MemberEntity element, Dependencies dependencies) {
270275
WorldImpact worldImpact = compiler.impactCache[element];
271276
compiler.impactStrategy.visitImpact(
272277
element,
273278
worldImpact,
274-
new WorldImpactVisitorImpl(visitStaticUse: (StaticUse staticUse) {
279+
new WorldImpactVisitorImpl(
280+
visitStaticUse: (MemberEntity member, StaticUse staticUse) {
275281
Entity usedEntity = staticUse.element;
276282
if (usedEntity is MemberEntity) {
277283
dependencies.addMember(usedEntity, staticUse.deferredImport);
@@ -306,7 +312,7 @@ abstract class DeferredLoadTask extends CompilerTask {
306312
break;
307313
default:
308314
}
309-
}, visitTypeUse: (TypeUse typeUse) {
315+
}, visitTypeUse: (MemberEntity member, TypeUse typeUse) {
310316
DartType type = typeUse.type;
311317
switch (typeUse.kind) {
312318
case TypeUseKind.TYPE_LITERAL:
@@ -327,17 +333,21 @@ abstract class DeferredLoadTask extends CompilerTask {
327333
_collectTypeDependencies(type, dependencies);
328334
break;
329335
case TypeUseKind.AS_CAST:
330-
if (!compiler.options.omitAsCasts) {
336+
if (!closedWorld.annotationsData.omitAsCasts(element)) {
331337
_collectTypeDependencies(type, dependencies);
332338
}
333339
break;
334340
case TypeUseKind.IMPLICIT_CAST:
335-
if (compiler.options.implicitDowncastCheckPolicy.isEmitted) {
341+
if (closedWorld.annotationsData
342+
.getImplicitDowncastCheckPolicy(element)
343+
.isEmitted) {
336344
_collectTypeDependencies(type, dependencies);
337345
}
338346
break;
339347
case TypeUseKind.PARAMETER_CHECK:
340-
if (compiler.options.parameterCheckPolicy.isEmitted) {
348+
if (closedWorld.annotationsData
349+
.getParameterCheckPolicy(element)
350+
.isEmitted) {
341351
_collectTypeDependencies(type, dependencies);
342352
}
343353
break;
@@ -346,7 +356,7 @@ abstract class DeferredLoadTask extends CompilerTask {
346356
failedAt(element, "Unexpected type use: $typeUse.");
347357
break;
348358
}
349-
}, visitDynamicUse: (DynamicUse dynamicUse) {
359+
}, visitDynamicUse: (MemberEntity member, DynamicUse dynamicUse) {
350360
// TODO(johnniwinther): Use rti need data to skip unneeded type
351361
// arguments.
352362
_collectTypeArgumentDependencies(
@@ -360,8 +370,12 @@ abstract class DeferredLoadTask extends CompilerTask {
360370
/// import set, we stop and enqueue a new recursive update in [queue].
361371
///
362372
/// Invariants: oldSet is either null or a subset of newSet.
363-
void _updateConstantRecursive(ConstantValue constant, ImportSet oldSet,
364-
ImportSet newSet, WorkQueue queue) {
373+
void _updateConstantRecursive(
374+
KClosedWorld closedWorld,
375+
ConstantValue constant,
376+
ImportSet oldSet,
377+
ImportSet newSet,
378+
WorkQueue queue) {
365379
if (constant == null) return;
366380
var currentSet = _constantToSet[constant];
367381

@@ -375,19 +389,21 @@ abstract class DeferredLoadTask extends CompilerTask {
375389
_constantToSet[constant] = newSet;
376390
if (constant is ConstructedConstantValue) {
377391
ClassEntity cls = constant.type.element;
378-
_updateClassRecursive(cls, oldSet, newSet, queue);
392+
_updateClassRecursive(closedWorld, cls, oldSet, newSet, queue);
379393
}
380394
if (constant is InstantiationConstantValue) {
381395
for (DartType type in constant.typeArguments) {
382396
if (type is InterfaceType) {
383-
_updateClassRecursive(type.element, oldSet, newSet, queue);
397+
_updateClassRecursive(
398+
closedWorld, type.element, oldSet, newSet, queue);
384399
}
385400
}
386401
}
387402
constant.getDependencies().forEach((ConstantValue dependency) {
388403
// Constants are not allowed to refer to deferred constants, so
389404
// no need to check for a deferred type literal here.
390-
_updateConstantRecursive(dependency, oldSet, newSet, queue);
405+
_updateConstantRecursive(
406+
closedWorld, dependency, oldSet, newSet, queue);
391407
});
392408
} else {
393409
assert(
@@ -401,8 +417,8 @@ abstract class DeferredLoadTask extends CompilerTask {
401417
}
402418
}
403419

404-
void _updateClassRecursive(ClassEntity element, ImportSet oldSet,
405-
ImportSet newSet, WorkQueue queue) {
420+
void _updateClassRecursive(KClosedWorld closedWorld, ClassEntity element,
421+
ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
406422
if (element == null) return;
407423

408424
ImportSet currentSet = _classToSet[element];
@@ -419,17 +435,18 @@ abstract class DeferredLoadTask extends CompilerTask {
419435
_classToSet[element] = newSet;
420436

421437
Dependencies dependencies = new Dependencies();
422-
_collectAllElementsAndConstantsResolvedFromClass(element, dependencies);
438+
_collectAllElementsAndConstantsResolvedFromClass(
439+
closedWorld, element, dependencies);
423440
LibraryEntity library = element.library;
424441
_processDependencies(
425-
library, dependencies, oldSet, newSet, queue, element);
442+
closedWorld, library, dependencies, oldSet, newSet, queue, element);
426443
} else {
427444
queue.addClass(element, newSet);
428445
}
429446
}
430447

431-
void _updateMemberRecursive(MemberEntity element, ImportSet oldSet,
432-
ImportSet newSet, WorkQueue queue) {
448+
void _updateMemberRecursive(KClosedWorld closedWorld, MemberEntity element,
449+
ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
433450
if (element == null) return;
434451

435452
ImportSet currentSet = _memberToSet[element];
@@ -446,11 +463,12 @@ abstract class DeferredLoadTask extends CompilerTask {
446463
_memberToSet[element] = newSet;
447464

448465
Dependencies dependencies = new Dependencies();
449-
_collectAllElementsAndConstantsResolvedFromMember(element, dependencies);
466+
_collectAllElementsAndConstantsResolvedFromMember(
467+
closedWorld, element, dependencies);
450468

451469
LibraryEntity library = element.library;
452470
_processDependencies(
453-
library, dependencies, oldSet, newSet, queue, element);
471+
closedWorld, library, dependencies, oldSet, newSet, queue, element);
454472
} else {
455473
queue.addMember(element, newSet);
456474
}
@@ -542,8 +560,14 @@ abstract class DeferredLoadTask extends CompilerTask {
542560
}
543561
}
544562

545-
void _processDependencies(LibraryEntity library, Dependencies dependencies,
546-
ImportSet oldSet, ImportSet newSet, WorkQueue queue, Spannable context) {
563+
void _processDependencies(
564+
KClosedWorld closedWorld,
565+
LibraryEntity library,
566+
Dependencies dependencies,
567+
ImportSet oldSet,
568+
ImportSet newSet,
569+
WorkQueue queue,
570+
Spannable context) {
547571
dependencies.classes.forEach((ClassEntity cls, DependencyInfo info) {
548572
_fixClassDependencyInfo(info, cls, library, context);
549573
if (info.isDeferred) {
@@ -553,7 +577,7 @@ abstract class DeferredLoadTask extends CompilerTask {
553577
}
554578
}
555579
} else {
556-
_updateClassRecursive(cls, oldSet, newSet, queue);
580+
_updateClassRecursive(closedWorld, cls, oldSet, newSet, queue);
557581
}
558582
});
559583

@@ -566,7 +590,7 @@ abstract class DeferredLoadTask extends CompilerTask {
566590
}
567591
}
568592
} else {
569-
_updateMemberRecursive(member, oldSet, newSet, queue);
593+
_updateMemberRecursive(closedWorld, member, oldSet, newSet, queue);
570594
}
571595
});
572596

@@ -584,7 +608,7 @@ abstract class DeferredLoadTask extends CompilerTask {
584608
}
585609
}
586610
} else {
587-
_updateConstantRecursive(constant, oldSet, newSet, queue);
611+
_updateConstantRecursive(closedWorld, constant, oldSet, newSet, queue);
588612
}
589613
});
590614
}
@@ -773,7 +797,7 @@ abstract class DeferredLoadTask extends CompilerTask {
773797
void emptyQueue() {
774798
while (queue.isNotEmpty) {
775799
WorkItem item = queue.nextItem();
776-
item.update(this, queue);
800+
item.update(this, closedWorld, queue);
777801
}
778802
}
779803

@@ -1167,7 +1191,7 @@ abstract class WorkItem {
11671191

11681192
WorkItem(this.importsToAdd);
11691193

1170-
void update(DeferredLoadTask task, WorkQueue queue);
1194+
void update(DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue);
11711195
}
11721196

11731197
/// Summary of the work that needs to be done on a class.
@@ -1178,11 +1202,12 @@ class ClassWorkItem extends WorkItem {
11781202
ClassWorkItem(this.cls, ImportSet newSet) : super(newSet);
11791203

11801204
@override
1181-
void update(DeferredLoadTask task, WorkQueue queue) {
1205+
void update(
1206+
DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
11821207
queue.pendingClasses.remove(cls);
11831208
ImportSet oldSet = task._classToSet[cls];
11841209
ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
1185-
task._updateClassRecursive(cls, oldSet, newSet, queue);
1210+
task._updateClassRecursive(closedWorld, cls, oldSet, newSet, queue);
11861211
}
11871212
}
11881213

@@ -1194,11 +1219,12 @@ class MemberWorkItem extends WorkItem {
11941219
MemberWorkItem(this.member, ImportSet newSet) : super(newSet);
11951220

11961221
@override
1197-
void update(DeferredLoadTask task, WorkQueue queue) {
1222+
void update(
1223+
DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
11981224
queue.pendingMembers.remove(member);
11991225
ImportSet oldSet = task._memberToSet[member];
12001226
ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
1201-
task._updateMemberRecursive(member, oldSet, newSet, queue);
1227+
task._updateMemberRecursive(closedWorld, member, oldSet, newSet, queue);
12021228
}
12031229
}
12041230

@@ -1210,11 +1236,12 @@ class ConstantWorkItem extends WorkItem {
12101236
ConstantWorkItem(this.constant, ImportSet newSet) : super(newSet);
12111237

12121238
@override
1213-
void update(DeferredLoadTask task, WorkQueue queue) {
1239+
void update(
1240+
DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
12141241
queue.pendingConstants.remove(constant);
12151242
ImportSet oldSet = task._constantToSet[constant];
12161243
ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
1217-
task._updateConstantRecursive(constant, oldSet, newSet, queue);
1244+
task._updateConstantRecursive(closedWorld, constant, oldSet, newSet, queue);
12181245
}
12191246
}
12201247

0 commit comments

Comments
 (0)