blob: 531f7d28f132f284b67a34a56a47634553dcc77d [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.procedure_attributes;
import 'package:kernel/ast.dart';
/// Metadata for annotating procedures with various attributes.
class ProcedureAttributesMetadata {
final bool hasDynamicUses;
final bool hasNonThisUses;
final bool hasTearOffUses;
const ProcedureAttributesMetadata(
{this.hasDynamicUses, this.hasNonThisUses, this.hasTearOffUses});
const ProcedureAttributesMetadata.noDynamicUses()
: this(hasDynamicUses: false, hasNonThisUses: true, hasTearOffUses: true);
@override
String toString() => "hasDynamicUses:$hasDynamicUses,"
"hasNonThisUses:$hasNonThisUses,"
"hasTearOffUses:$hasTearOffUses";
}
/// Repository for [ProcedureAttributesMetadata].
class ProcedureAttributesMetadataRepository
extends MetadataRepository<ProcedureAttributesMetadata> {
static const int kDynamicUsesBit = 1 << 0;
static const int kNonThisUsesBit = 1 << 1;
static const int kTearOffUsesBit = 1 << 2;
@override
final String tag = 'vm.procedure-attributes.metadata';
@override
final Map<TreeNode, ProcedureAttributesMetadata> mapping =
<TreeNode, ProcedureAttributesMetadata>{};
@override
void writeToBinary(
ProcedureAttributesMetadata metadata, Node node, BinarySink sink) {
int flags = 0;
if (metadata.hasDynamicUses) {
flags |= kDynamicUsesBit;
}
if (metadata.hasNonThisUses) {
flags |= kNonThisUsesBit;
}
if (metadata.hasTearOffUses) {
flags |= kTearOffUsesBit;
}
sink.writeByte(flags);
}
@override
ProcedureAttributesMetadata readFromBinary(Node node, BinarySource source) {
final int flags = source.readByte();
final bool hasDynamicUses = (flags & kDynamicUsesBit) == kDynamicUsesBit;
final bool hasNonThisUses = (flags & kNonThisUsesBit) == kNonThisUsesBit;
final bool hasTearOffUses = (flags & kTearOffUsesBit) == kTearOffUsesBit;
return new ProcedureAttributesMetadata(
hasDynamicUses: hasDynamicUses,
hasNonThisUses: hasNonThisUses,
hasTearOffUses: hasTearOffUses);
}
}