blob: 2de4db5a2710dc960b56b8d83ca27763fff04d01 [file] [log] [blame]
// Copyright (c) 2023, 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.
import '../ir/ir.dart' as ir;
import 'builder.dart';
// TODO(joshualitt): Get rid of cycles in the builder graph.
/// A Wasm module builder.
class ModuleBuilder with Builder<ir.Module> {
final String moduleName;
final Uri? sourceMapUrl;
final List<int> watchPoints;
late final TypesBuilder types;
late final functions = FunctionsBuilder(this);
late final tables = TablesBuilder(this);
late final memories = MemoriesBuilder(this);
late final tags = TagsBuilder(this);
final dataSegments = DataSegmentsBuilder();
late final globals = GlobalsBuilder(this);
final exports = ExportsBuilder();
/// Create a new, initially empty, module.
///
/// The [watchPoints] is a list of byte offsets within the final module of
/// bytes to watch. When the module is serialized, the stack traces leading
/// to the production of all watched bytes are printed. This can be used to
/// debug runtime errors happening at specific offsets within the module.
ModuleBuilder(this.moduleName, this.sourceMapUrl,
{ModuleBuilder? parent, this.watchPoints = const []}) {
types = TypesBuilder(this, parent: parent?.types);
}
@override
ir.Module forceBuild() {
final finalFunctions = functions.build();
final finalTables = tables.build();
final finalMemories = memories.build();
final finalGlobals = globals.build();
final finalTags = tags.build();
return ir.Module(
moduleName,
sourceMapUrl,
finalFunctions,
finalTables,
finalTags,
finalMemories,
exports.build(),
finalGlobals,
types.build(),
dataSegments.build(),
<ir.Import>[
...finalFunctions.imported,
...finalTables.imported,
...finalMemories.imported,
...finalGlobals.imported,
...finalTags.imported,
],
watchPoints);
}
}