| // 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 'dart:typed_data'; |
| |
| import '../ir/ir.dart' as ir; |
| import 'builder.dart'; |
| |
| /// A data segment builder in a module builder. |
| class DataSegmentBuilder with Builder<ir.DataSegment> { |
| final ir.DataSegment dataSegment; |
| final BytesBuilder content; |
| |
| DataSegmentBuilder(this.dataSegment, [Uint8List? initialContent]) |
| : content = BytesBuilder() { |
| if (initialContent != null && initialContent.isNotEmpty) { |
| content.add(initialContent); |
| } |
| } |
| |
| int get index => dataSegment.index; |
| ir.Memory? get memory => dataSegment.memory; |
| int? get offset => dataSegment.offset; |
| |
| bool get isActive => memory != null; |
| bool get isPassive => memory == null; |
| |
| int get length => content.length; |
| |
| /// Append content to the data segment. |
| void append(Uint8List data) { |
| content.add(data); |
| assert( |
| isPassive || offset! >= 0 && offset! + content.length <= memory!.minSize, |
| ); |
| } |
| |
| @override |
| ir.DataSegment forceBuild() { |
| dataSegment.content = content.toBytes(); |
| return dataSegment; |
| } |
| } |