d65a60db00
AST "without_change_elapsed_time_ms": 2863, "implementation_change_elapsed_time_ms": 6009, "interface_change_elapsed_time_ms": 5888, "with_coverage_time_ms": 2884 BYTECODE BEFORE "without_change_elapsed_time_ms": 5216, "implementation_change_elapsed_time_ms": 8517, "interface_change_elapsed_time_ms": 8895, "with_coverage_time_ms": 5462 BYTECODE AFTER "without_change_elapsed_time_ms": 3384, "implementation_change_elapsed_time_ms": 8139, "interface_change_elapsed_time_ms": 8073, "with_coverage_time_ms": 3473 Change-Id: Ic8e1c183070cb6019ea48f16c04ea5363df41a97 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119620 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
100 lines
2.9 KiB
Dart
100 lines
2.9 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 '../bytecode/bytecode_serialization.dart'
|
|
show BufferedWriter, BufferedReader, LinkWriter, LinkReader;
|
|
import '../bytecode/declarations.dart' show Component;
|
|
|
|
import 'dart:developer';
|
|
|
|
class BytecodeMetadata {
|
|
final Component component;
|
|
|
|
BytecodeMetadata(this.component);
|
|
|
|
void write(BufferedWriter writer) {
|
|
Timeline.timeSync("BytecodeMetadata.write", () {
|
|
component.write(writer);
|
|
});
|
|
}
|
|
|
|
factory BytecodeMetadata.read(BufferedReader reader) {
|
|
return Timeline.timeSync("BytecodeMetadata.read", () {
|
|
return new BytecodeMetadata(new Component.read(reader));
|
|
});
|
|
}
|
|
|
|
@override
|
|
String toString() => "\n"
|
|
"BytecodeMetadata {\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>{};
|
|
|
|
@override
|
|
void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
|
|
final bytecodeComponent = metadata.component;
|
|
final linkWriter = new LinkWriter();
|
|
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) {
|
|
final linkReader = new LinkReader();
|
|
final reader = new BufferedReader(-1, null, null, linkReader, source.bytes,
|
|
baseOffset: source.currentOffset);
|
|
final bytecodeComponent = new Component.read(reader);
|
|
return new BytecodeMetadata(bytecodeComponent);
|
|
}
|
|
}
|
|
|
|
class BinaryCacheMetadataRepository extends MetadataRepository<List<int>> {
|
|
static const repositoryTag = 'vm.bytecode.cache';
|
|
|
|
@override
|
|
String get tag => repositoryTag;
|
|
|
|
@override
|
|
final Map<TreeNode, List<int>> mapping = <TreeNode, List<int>>{};
|
|
|
|
@override
|
|
void writeToBinary(List<int> metadata, Node node, BinarySink sink) {
|
|
sink.writeByteList(metadata);
|
|
}
|
|
|
|
@override
|
|
List<int> readFromBinary(Node node, BinarySource source) {
|
|
List<int> result = source.readByteList();
|
|
_weakMap[node] = result;
|
|
return result;
|
|
}
|
|
|
|
static List<int> lookup(Node node) => _weakMap[node];
|
|
static void insert(Node node, List<int> metadata) {
|
|
_weakMap[node] = metadata;
|
|
}
|
|
|
|
static final _weakMap = new Expando<List<int>>();
|
|
}
|