| // 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 '../serialize/serialize.dart'; |
| import 'ir.dart'; |
| |
| class BaseDataSegment { |
| final int index; |
| final Memory? memory; |
| final int? offset; |
| |
| BaseDataSegment(this.index, this.memory, this.offset); |
| } |
| |
| /// A data segment in a module. |
| class DataSegment extends BaseDataSegment implements Serializable { |
| final Uint8List content; |
| |
| DataSegment(super.index, this.content, super.memory, super.offset); |
| |
| @override |
| void serialize(Serializer s) { |
| if (memory != null) { |
| // Active segment |
| if (memory!.index == 0) { |
| s.writeByte(0x00); |
| } else { |
| s.writeByte(0x02); |
| s.writeUnsigned(memory!.index); |
| } |
| s.writeByte(0x41); // i32.const |
| s.writeSigned(offset!); |
| s.writeByte(0x0B); // end |
| } else { |
| // Passive segment |
| s.writeByte(0x01); |
| } |
| s.writeUnsigned(content.length); |
| s.writeBytes(content); |
| } |
| } |