[dart2js] Minor cleanup of classes needed for rti computation.
Change-Id: I641ed8f7c91f8b0d52b4542559a13b60d82e42e8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/205244 Commit-Queue: Joshua Litt <joshualitt@google.com> Reviewed-by: Mayank Patke <fishythefish@google.com>
This commit is contained in:
committed by
commit-bot@chromium.org
parent
46189bcb19
commit
fc7aa585ea
@@ -79,9 +79,6 @@ class CodeEmitterTask extends CompilerTask {
|
||||
// 'is$' method.
|
||||
typeTestRegistry.computeRequiredTypeChecks(
|
||||
_backendStrategy.rtiChecksBuilder, codegenWorld);
|
||||
// Compute the classes needed by RTI.
|
||||
typeTestRegistry.computeRtiNeededClasses(
|
||||
codegen.rtiSubstitutions, _backendStrategy.generatedCode.keys);
|
||||
}
|
||||
|
||||
/// Creates the [Emitter] for this task.
|
||||
@@ -104,8 +101,7 @@ class CodeEmitterTask extends CompilerTask {
|
||||
_generateSourceMap);
|
||||
metadataCollector = new MetadataCollector(
|
||||
_compiler.reporter, _emitter, codegen.rtiRecipeEncoder);
|
||||
typeTestRegistry = new TypeTestRegistry(
|
||||
_compiler.options, closedWorld.elementEnvironment);
|
||||
typeTestRegistry = new TypeTestRegistry(_compiler.options);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -175,9 +175,7 @@ class Collector {
|
||||
// 4. Find all class types needed for rti.
|
||||
for (ClassEntity cls in _rtiNeededClasses) {
|
||||
if (backendTypeHelpers.contains(cls)) continue;
|
||||
while (cls != null && neededClassTypes.add(cls)) {
|
||||
cls = _elementEnvironment.getSuperClass(cls);
|
||||
}
|
||||
neededClassTypes.add(cls);
|
||||
}
|
||||
|
||||
// 5. Sort classes and add them to their respective OutputUnits.
|
||||
|
||||
@@ -5,27 +5,20 @@
|
||||
library dart2js.js_emitter.type_test_registry;
|
||||
|
||||
import '../common.dart';
|
||||
import '../common_elements.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../js_backend/runtime_types.dart'
|
||||
show RuntimeTypesChecks, RuntimeTypesChecksBuilder;
|
||||
import '../js_backend/runtime_types_codegen.dart'
|
||||
show RuntimeTypesSubstitutions;
|
||||
import '../options.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
|
||||
/// TODO(joshualitt): Delete this class and store [RuntimeTypeChecks] on
|
||||
/// [CodeEmitterTask] directly.
|
||||
class TypeTestRegistry {
|
||||
final ElementEnvironment _elementEnvironment;
|
||||
|
||||
/// After [computeNeededClasses] this set only contains classes that are only
|
||||
/// used for RTI.
|
||||
Set<ClassEntity> _rtiNeededClasses;
|
||||
|
||||
final CompilerOptions _options;
|
||||
|
||||
RuntimeTypesChecks _rtiChecks;
|
||||
|
||||
TypeTestRegistry(this._options, this._elementEnvironment);
|
||||
TypeTestRegistry(this._options);
|
||||
|
||||
RuntimeTypesChecks get rtiChecks {
|
||||
assert(
|
||||
@@ -36,35 +29,7 @@ class TypeTestRegistry {
|
||||
}
|
||||
|
||||
Iterable<ClassEntity> get rtiNeededClasses {
|
||||
assert(
|
||||
_rtiNeededClasses != null,
|
||||
failedAt(NO_LOCATION_SPANNABLE,
|
||||
"rtiNeededClasses has not been computed yet."));
|
||||
return _rtiNeededClasses;
|
||||
}
|
||||
|
||||
void computeRtiNeededClasses(RuntimeTypesSubstitutions rtiSubstitutions,
|
||||
Iterable<MemberEntity> liveMembers) {
|
||||
_rtiNeededClasses = new Set<ClassEntity>();
|
||||
|
||||
void addClassWithSuperclasses(ClassEntity cls) {
|
||||
_rtiNeededClasses.add(cls);
|
||||
for (ClassEntity superclass = _elementEnvironment.getSuperClass(cls);
|
||||
superclass != null;
|
||||
superclass = _elementEnvironment.getSuperClass(superclass)) {
|
||||
_rtiNeededClasses.add(superclass);
|
||||
}
|
||||
}
|
||||
|
||||
void addClassesWithSuperclasses(Iterable<ClassEntity> classes) {
|
||||
for (ClassEntity cls in classes) {
|
||||
addClassWithSuperclasses(cls);
|
||||
}
|
||||
}
|
||||
|
||||
// Add classes that are referenced by type arguments or substitutions in
|
||||
// argument checks.
|
||||
addClassesWithSuperclasses(rtiChecks.requiredClasses);
|
||||
return rtiChecks.requiredClasses;
|
||||
}
|
||||
|
||||
void computeRequiredTypeChecks(
|
||||
|
||||
Reference in New Issue
Block a user