61f0f5bc43
This change replaces kernel AST declarations of fields and functions with bytecode declarations. Size of dilp files is reduced by 11-12%. Startup latency: Time to the first full frame: 1.945s -> 1.687s FinalizeClass: 554ms -> 277ms FinishClassLoading: 296ms -> 156ms There are following regressions in bytecode mode, which will be fixed in future: * dart:mirrors are not supported yet (implementation of mirrors relies on reading kernel AST in certain cases). As the result, lib_2/mirrors/* tests fail. * native extensions are not supported yet (annotations on libraries and classes in AST are cleaned up as they could reference members which are now removed from AST). As the result, standalone_2/entrypoints_verification_test test fails. * language_2/spread_collections/const_error_test/* tests fail due to https://github.com/dart-lang/sdk/issues/36286. Change-Id: I5130f401fd7b84038b136136e7ccc1a6e51b6cea Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97561 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
113 lines
3.2 KiB
Dart
113 lines
3.2 KiB
Dart
// 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<Members>());
|
|
}
|
|
|
|
@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<BytecodeMetadata> {
|
|
@override
|
|
final String tag = 'vm.bytecode';
|
|
|
|
@override
|
|
final Map<TreeNode, BytecodeMetadata> mapping =
|
|
<TreeNode, BytecodeMetadata>{};
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|