// Copyright (c) 2018, 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.bytecode; import 'package:kernel/ast.dart' show BinarySink, BinarySource, MetadataRepository, Node, TreeNode; import 'package:kernel/ast.dart' as ast show Component; import '../bytecode/bytecode_serialization.dart' show BufferedWriter, BufferedReader, LinkWriter, LinkReader; import '../bytecode/declarations.dart' show Component, Members; abstract class BytecodeMetadata { void write(BufferedWriter writer); } class MembersBytecodeMetadata extends BytecodeMetadata { final Members members; MembersBytecodeMetadata(this.members); @override void write(BufferedWriter writer) { writer.writeLinkOffset(members); } factory MembersBytecodeMetadata.read(BufferedReader reader) { return new MembersBytecodeMetadata(reader.readLinkOffset()); } @override String toString() => "\n" "MembersBytecodeMetadata {\n" "$members\n" "}\n"; } class ComponentBytecodeMetadata extends BytecodeMetadata { final Component component; ComponentBytecodeMetadata(this.component); @override void write(BufferedWriter writer) { component.write(writer); } factory ComponentBytecodeMetadata.read(BufferedReader reader) { return new ComponentBytecodeMetadata(new Component.read(reader)); } @override String toString() => "\n" "ComponentBytecodeMetadata {\n" "$component\n" "}\n"; } /// Repository for [BytecodeMetadata]. class BytecodeMetadataRepository extends MetadataRepository { @override final String tag = 'vm.bytecode'; @override final Map mapping = {}; Component bytecodeComponent; LinkWriter linkWriter; LinkReader linkReader; @override void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) { if (node is ast.Component) { bytecodeComponent = (metadata as ComponentBytecodeMetadata).component; linkWriter = new LinkWriter(); } else { assert(bytecodeComponent != null); assert(linkWriter != null); } final writer = new BufferedWriter( bytecodeComponent.version, bytecodeComponent.stringTable, bytecodeComponent.objectTable, linkWriter, baseOffset: sink.getBufferOffset()); metadata.write(writer); sink.writeBytes(writer.takeBytes()); } @override BytecodeMetadata readFromBinary(Node node, BinarySource source) { if (node is ast.Component) { linkReader = new LinkReader(); final reader = new BufferedReader( -1, null, null, linkReader, source.bytes, baseOffset: source.currentOffset); bytecodeComponent = new Component.read(reader); return new ComponentBytecodeMetadata(bytecodeComponent); } else { final reader = new BufferedReader( bytecodeComponent.version, bytecodeComponent.stringTable, bytecodeComponent.objectTable, linkReader, source.bytes, baseOffset: source.currentOffset); return new MembersBytecodeMetadata.read(reader); } } }