blob: 17eb4e8ad31e2168510b57a7214edfd27a79221f [file] [log] [blame]
// Copyright (c) 2017, 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.direct_call;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
/// Metadata for annotating method invocations converted to direct calls.
class DirectCallMetadata {
final Reference _targetReference;
final bool checkReceiverForNull;
DirectCallMetadata(Member target, bool checkReceiverForNull)
: this.byReference(getMemberReference(target), checkReceiverForNull);
DirectCallMetadata.byReference(
this._targetReference, this.checkReceiverForNull);
Member get target => _targetReference.asMember;
@override
String toString() => "${target.toText(astTextStrategyForTesting)}"
"${checkReceiverForNull ? '??' : ''}";
}
/// Repository for [DirectCallMetadata].
class DirectCallMetadataRepository
extends MetadataRepository<DirectCallMetadata> {
static const repositoryTag = 'vm.direct-call.metadata';
@override
String get tag => repositoryTag;
@override
final Map<TreeNode, DirectCallMetadata> mapping =
<TreeNode, DirectCallMetadata>{};
@override
void writeToBinary(DirectCallMetadata metadata, Node node, BinarySink sink) {
sink.writeNullAllowedCanonicalNameReference(
getCanonicalNameOfMember(metadata.target));
sink.writeByte(metadata.checkReceiverForNull ? 1 : 0);
}
@override
DirectCallMetadata readFromBinary(Node node, BinarySource source) {
final targetReference = source.readCanonicalNameReference()?.getReference();
if (targetReference == null) {
throw 'DirectCallMetadata should have a non-null target';
}
final checkReceiverForNull = (source.readByte() != 0);
return new DirectCallMetadata.byReference(
targetReference, checkReceiverForNull);
}
}