Skip to content

Commit 7b28c5a

Browse files
natebiggsCommit Queue
authored andcommitted
[dart2wasm] Update serialization strategy for dynamic modules.
Introduces some more machinery to simplify the serialization pipeline. Now the logic to index kernel nodes is hidden away in the serializer. Now throughout the compiler if entities (i.e. classes, members and references) need to be serialized they can be passed to the serializer directly. Also adds support for tracking brand type assignments from the main module to the dynamic module. This is necessary to decouple the execution order of both compilations which is a WIP. Change-Id: I38dd0ed11811ea12a2230959588b261719976592 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412461 Reviewed-by: Martin Kustermann <[email protected]> Commit-Queue: Nate Biggs <[email protected]>
1 parent 0e556f6 commit 7b28c5a

File tree

9 files changed

+471
-353
lines changed

9 files changed

+471
-353
lines changed

pkg/dart2wasm/lib/class_info.dart

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,14 @@ class ClassInfoCollector {
373373
// conservative and mark it as not being final.
374374
struct.hasAnySubtypes = true;
375375
}
376+
377+
if (translator.isDynamicModule) {
378+
final brandIndex =
379+
translator.dynamicModuleInfo!.classMetadata[cls]?.brandIndex;
380+
if (brandIndex != null) {
381+
translator.typesBuilder.addBrandTypeAssignment(struct, brandIndex);
382+
}
383+
}
376384
}
377385
translator.classesSupersFirst.add(info);
378386
translator.classInfo[cls] = info;
@@ -700,9 +708,10 @@ class ClassIdNumbering {
700708
final implementors = <Class, List<Class>>{};
701709
final classIds = <Class, ClassId>{};
702710

703-
final savedMapping = translator.dynamicModuleInfo?.classIdMapping;
704-
if (savedMapping != null) {
705-
savedMapping.forEach((cls, classId) {
711+
if (translator.isDynamicModule) {
712+
final savedMapping = translator.dynamicModuleInfo!.classMetadata;
713+
savedMapping.forEach((cls, info) {
714+
final classId = info.classId;
706715
classIds[cls] = AbsoluteClassId(classId);
707716
savedMaxClassId = max(savedMaxClassId ?? -2, classId);
708717
if (!cls.isAbstract && !cls.isAnonymousMixin) {
@@ -796,8 +805,7 @@ class ClassIdNumbering {
796805
}
797806

798807
// Make a list of the depth-first pre-order traversal.
799-
final dfsOrder =
800-
translator.dynamicModuleInfo?.dfsOrderClassIds ?? <Class>[];
808+
final dfsOrder = [...?translator.dynamicModuleInfo?.dfsOrderClassIds];
801809
final inDfsOrder = {...dfsOrder};
802810

803811
// Maps any class to a dense range of concrete class ids that are subclasses
@@ -907,6 +915,9 @@ final class AbsoluteClassId extends ClassId {
907915
int get _localValue => value;
908916

909917
AbsoluteClassId(this.value);
918+
919+
@override
920+
String toString() => 'Absolute($value)';
910921
}
911922

912923
final class RelativeClassId extends ClassId {
@@ -915,6 +926,9 @@ final class RelativeClassId extends ClassId {
915926
int get _localValue => relativeValue;
916927

917928
RelativeClassId(this.relativeValue);
929+
930+
@override
931+
String toString() => 'Relative($relativeValue)';
918932
}
919933

920934
// A range of class ids, both ends inclusive.

pkg/dart2wasm/lib/compile.dart

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,7 @@ Future<CompilationResult> compileToModule(
158158
compilerOptions.compileSdk = true;
159159
}
160160

161-
DynamicModuleMetadata? dynamicModuleMetadata;
162161
final dynamicMainModuleUri = options.dynamicModuleMainUri;
163-
if (dynamicMainModuleUri != null && options.dynamicInterfaceUri == null) {
164-
final filename = options.dynamicModuleMetadataFile ??
165-
Uri.parse(
166-
path.setExtension(dynamicMainModuleUri.toFilePath(), '.dyndata'));
167-
final dynamicModuleMetadataBytes =
168-
await File.fromUri(filename).readAsBytes();
169-
final source = BinaryDataSource(dynamicModuleMetadataBytes);
170-
dynamicModuleMetadata = DynamicModuleMetadata.deserialize(source);
171-
}
172162

173163
final dynamicModuleMainUri = await resolveUri(options.dynamicModuleMainUri);
174164
final dynamicInterfaceUri = await resolveUri(options.dynamicInterfaceUri);
@@ -177,10 +167,7 @@ Future<CompilationResult> compileToModule(
177167
final isDynamicModule =
178168
dynamicModuleMainUri != null && dynamicInterfaceUri == null;
179169
if (isDynamicModule) {
180-
dynamicModuleMetadata!.verifyDynamicModuleOptions(options);
181170
compilerOptions.additionalDills.add(dynamicModuleMainUri);
182-
} else if (isDynamicMainModule) {
183-
DynamicModuleMetadata.verifyMainModuleOptions(options);
184171
}
185172

186173
CompilerResult? compilerResult;
@@ -268,7 +255,20 @@ Future<CompilationResult> compileToModule(
268255

269256
moduleStrategy.prepareComponent();
270257

271-
if (isDynamicMainModule) {
258+
MainModuleMetadata mainModuleMetadata =
259+
MainModuleMetadata.empty(options.translatorOptions, options.environment);
260+
261+
if (isDynamicModule) {
262+
final filename = options.dynamicModuleMetadataFile ??
263+
Uri.parse(
264+
path.setExtension(dynamicMainModuleUri!.toFilePath(), '.dyndata'));
265+
final dynamicModuleMetadataBytes =
266+
await File.fromUri(filename).readAsBytes();
267+
final source = DataDeserializer(dynamicModuleMetadataBytes, component);
268+
mainModuleMetadata = MainModuleMetadata.deserialize(source);
269+
mainModuleMetadata.verifyDynamicModuleOptions(options);
270+
} else if (isDynamicMainModule) {
271+
MainModuleMetadata.verifyMainModuleOptions(options);
272272
writeComponentToBinary(component, dynamicModuleMainUri.path,
273273
includeSource: false);
274274
}
@@ -301,9 +301,13 @@ Future<CompilationResult> compileToModule(
301301

302302
final moduleOutputData = moduleStrategy.buildModuleOutputData();
303303

304+
if (isDynamicMainModule) {
305+
mainModuleMetadata.initialize(component, coreTypes);
306+
}
307+
304308
var translator = Translator(component, coreTypes, libraryIndex, recordClasses,
305309
moduleOutputData, options.translatorOptions,
306-
dynamicModuleMetadata: dynamicModuleMetadata,
310+
mainModuleMetadata: mainModuleMetadata,
307311
enableDynamicModules: dynamicModuleMainUri != null);
308312

309313
String? depFile = options.depFile;
@@ -341,9 +345,9 @@ Future<CompilationResult> compileToModule(
341345
final filename = options.dynamicModuleMetadataFile ??
342346
Uri.parse(
343347
path.setExtension(dynamicMainModuleUri!.toFilePath(), '.dyndata'));
344-
final sink = BinaryDataSink();
345-
translator.dynamicModuleInfo!.toMetadata(options).serialize(sink);
346-
await File.fromUri(filename).writeAsBytes(sink.takeBytes());
348+
final serializer = DataSerializer(translator.component);
349+
translator.dynamicModuleInfo!.metadata.serialize(translator, serializer);
350+
await File.fromUri(filename).writeAsBytes(serializer.takeBytes());
347351
}
348352

349353
return CompilationSuccess(wasmModules, jsRuntime, supportJs);

pkg/dart2wasm/lib/dispatch_table.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,8 @@ class DispatchTable {
397397
(_dynamicMethods[member.name.text] ??= {}).add(selector);
398398
}
399399
}
400-
final mainModuleIds = translator.dynamicModuleInfo?.selectorIds?[member];
400+
401+
final mainModuleIds = translator.dynamicModuleInfo?.selectorIds[member];
401402
if (mainModuleIds != null) {
402403
selector._mainModuleIds[member] =
403404
isGetter ? mainModuleIds.$1 : mainModuleIds.$2;

0 commit comments

Comments
 (0)