Files
sdk/pkg/vm/lib/metadata/loading_units.dart
T
Ryan Macnak 6cc943957b [vm] Compute a partitioning of the program into loading units.
The partitioning has the property that for every reference from loading unit S to unit T, either
 - the reference is through a deferred prefix, or
 - T is guarenteed to be loaded before S

The partitioning is constructed by cutting the dominator tree of the library import graph at deferred imports. It is suboptimal if there are deferred imports to multiple libraries in a connected component, but the expected use case involves loading units with a single deferred entry.

Bug: https://github.com/dart-lang/sdk/issues/41974
Change-Id: I3c49044ae19112525f197b077b36e4ce874b81ac
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/151470
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-06-19 21:35:47 +00:00

86 lines
2.3 KiB
Dart

// Copyright (c) 2020, 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.
library vm.metadata.loading_units;
import 'package:kernel/ast.dart';
class LoadingUnit {
final int id;
final int parentId;
final List<String> libraryUris;
LoadingUnit(this.id, this.parentId, this.libraryUris);
String toString() {
var sb = new StringBuffer();
sb.writeln("LoadingUnit(id=$id, parent=${parentId},");
for (var uri in libraryUris) {
sb.writeln(" $uri");
}
sb.write(")");
return sb.toString();
}
}
class LoadingUnitsMetadata {
final List<LoadingUnit> loadingUnits;
LoadingUnitsMetadata(this.loadingUnits);
String toString() {
var sb = new StringBuffer();
sb.writeln("LoadingUnitsMetadata(");
for (var unit in loadingUnits) {
sb.writeln(unit.toString());
}
sb.write(")");
return sb.toString();
}
}
/// Repository for [LoadingUnitsMetadata].
class LoadingUnitsMetadataRepository
extends MetadataRepository<LoadingUnitsMetadata> {
static final repositoryTag = 'vm.loading-units.metadata';
@override
final String tag = repositoryTag;
@override
final Map<TreeNode, LoadingUnitsMetadata> mapping =
<TreeNode, LoadingUnitsMetadata>{};
@override
void writeToBinary(
LoadingUnitsMetadata metadata, Node node, BinarySink sink) {
sink.writeUInt30(metadata.loadingUnits.length);
for (LoadingUnit unit in metadata.loadingUnits) {
sink.writeUInt30(unit.id);
sink.writeUInt30(unit.parentId);
sink.writeUInt30(unit.libraryUris.length);
for (String uri in unit.libraryUris) {
sink.writeStringReference(uri);
}
}
}
@override
LoadingUnitsMetadata readFromBinary(Node node, BinarySource source) {
int length = source.readUInt();
var units = <LoadingUnit>[];
for (int i = 0; i < length; i++) {
int id = source.readUInt();
int parentId = source.readUInt();
var libraryUris = <String>[];
int length = source.readUInt();
for (int i = 0; i < length; i++) {
libraryUris.add(source.readStringReference());
}
units.add(new LoadingUnit(id, parentId, libraryUris));
}
return new LoadingUnitsMetadata(units);
}
}