[dart2wasm] Avoid O(n) scan to find module for a [Library].
Change-Id: I6e0a6813b8519b9432d4f7da18cfca1153d813c5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/464900
Reviewed-by: Ömer Ağacan <omersa@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
diff --git a/pkg/dart2wasm/lib/modules.dart b/pkg/dart2wasm/lib/modules.dart
index fdaefae..083ca68 100644
--- a/pkg/dart2wasm/lib/modules.dart
+++ b/pkg/dart2wasm/lib/modules.dart
@@ -72,13 +72,6 @@
ModuleMetadata._(this.moduleImportName, this.moduleName,
{this.skipEmit = false, this.isMain = false});
- /// Whether or not the provided kernel [Reference] is included in this module.
- bool containsReference(Reference reference) {
- final enclosingLibrary = _enclosingLibraryForReference(reference);
- if (enclosingLibrary == null) return false;
- return libraries.contains(enclosingLibrary);
- }
-
@override
String toString() => '$moduleImportName($libraries)';
}
@@ -88,6 +81,12 @@
/// All [ModuleMetadata]s generated for the program.
final List<ModuleMetadata> modules;
+ /// Maps the [Library] to the corresponding [ModuleMetadata].
+ late final Map<Library, ModuleMetadata> _libraryToModuleMetadata = {
+ for (final metadata in modules)
+ for (final library in metadata.libraries) library: metadata,
+ };
+
ModuleOutputData(this.modules) : assert(modules[0].isMain);
ModuleMetadata get mainModule => modules[0];
@@ -96,8 +95,9 @@
bool get hasMultipleModules => modules.length > 1;
/// Returns the module that contains [reference].
- ModuleMetadata moduleForReference(Reference reference) =>
- modules.firstWhere((e) => e.containsReference(reference));
+ ModuleMetadata moduleForReference(Reference reference) {
+ return _libraryToModuleMetadata[_enclosingLibraryForReference(reference)]!;
+ }
}
/// Module strategy that puts all libraries into a single module.