blob: dd9348cff38f0d59cc6ba39e287c2a596ee9033b [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';
/// 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}${checkReceiverForNull ? '??' : ''}";
}
/// Repository for [DirectCallMetadata].
class DirectCallMetadataRepository
extends MetadataRepository<DirectCallMetadata> {
@override
final String tag = 'vm.direct-call.metadata';
@override
final Map<TreeNode, DirectCallMetadata> mapping =
<TreeNode, DirectCallMetadata>{};
@override
void writeToBinary(DirectCallMetadata metadata, Node node, BinarySink sink) {
sink.writeCanonicalNameReference(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);
}
}