79f36c9d49
TEST=Refactoring Change-Id: I455c498065785909fb175a0b5fa82bd9d5b38f1f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/173524 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
126 lines
4.2 KiB
Dart
126 lines
4.2 KiB
Dart
// 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 {
|
|
static const int kInvalidSelectorId = 0;
|
|
|
|
final bool methodOrSetterCalledDynamically;
|
|
final bool getterCalledDynamically;
|
|
final bool hasThisUses;
|
|
final bool hasNonThisUses;
|
|
final bool hasTearOffUses;
|
|
final int methodOrSetterSelectorId;
|
|
final int getterSelectorId;
|
|
|
|
const ProcedureAttributesMetadata(
|
|
{this.methodOrSetterCalledDynamically: true,
|
|
this.getterCalledDynamically: true,
|
|
this.hasThisUses: true,
|
|
this.hasNonThisUses: true,
|
|
this.hasTearOffUses: true,
|
|
this.methodOrSetterSelectorId: kInvalidSelectorId,
|
|
this.getterSelectorId: kInvalidSelectorId});
|
|
|
|
const ProcedureAttributesMetadata.noDynamicUses()
|
|
: this(
|
|
methodOrSetterCalledDynamically: false,
|
|
getterCalledDynamically: false);
|
|
|
|
@override
|
|
String toString() {
|
|
final attrs = <String>[];
|
|
if (!methodOrSetterCalledDynamically) {
|
|
attrs.add('methodOrSetterCalledDynamically:false');
|
|
}
|
|
if (!getterCalledDynamically) attrs.add('getterCalledDynamically:false');
|
|
if (!hasThisUses) attrs.add('hasThisUses:false');
|
|
if (!hasNonThisUses) attrs.add('hasNonThisUses:false');
|
|
if (!hasTearOffUses) attrs.add('hasTearOffUses:false');
|
|
if (methodOrSetterSelectorId != kInvalidSelectorId) {
|
|
attrs.add('methodOrSetterSelectorId:$methodOrSetterSelectorId');
|
|
}
|
|
if (getterSelectorId != kInvalidSelectorId) {
|
|
attrs.add('getterSelectorId:$getterSelectorId');
|
|
}
|
|
return attrs.join(',');
|
|
}
|
|
}
|
|
|
|
/// Repository for [ProcedureAttributesMetadata].
|
|
class ProcedureAttributesMetadataRepository
|
|
extends MetadataRepository<ProcedureAttributesMetadata> {
|
|
static const int kMethodOrSetterCalledDynamicallyBit = 1 << 0;
|
|
static const int kNonThisUsesBit = 1 << 1;
|
|
static const int kTearOffUsesBit = 1 << 2;
|
|
static const int kThisUsesBit = 1 << 3;
|
|
static const int kGetterCalledDynamicallyBit = 1 << 4;
|
|
|
|
static const repositoryTag = 'vm.procedure-attributes.metadata';
|
|
|
|
@override
|
|
final String tag = repositoryTag;
|
|
|
|
@override
|
|
final Map<TreeNode, ProcedureAttributesMetadata> mapping =
|
|
<TreeNode, ProcedureAttributesMetadata>{};
|
|
|
|
int _getFlags(ProcedureAttributesMetadata metadata) {
|
|
int flags = 0;
|
|
if (metadata.methodOrSetterCalledDynamically) {
|
|
flags |= kMethodOrSetterCalledDynamicallyBit;
|
|
}
|
|
if (metadata.getterCalledDynamically) {
|
|
flags |= kGetterCalledDynamicallyBit;
|
|
}
|
|
if (metadata.hasThisUses) {
|
|
flags |= kThisUsesBit;
|
|
}
|
|
if (metadata.hasNonThisUses) {
|
|
flags |= kNonThisUsesBit;
|
|
}
|
|
if (metadata.hasTearOffUses) {
|
|
flags |= kTearOffUsesBit;
|
|
}
|
|
return flags;
|
|
}
|
|
|
|
@override
|
|
void writeToBinary(
|
|
ProcedureAttributesMetadata metadata, Node node, BinarySink sink) {
|
|
sink.writeByte(_getFlags(metadata));
|
|
sink.writeUInt30(metadata.methodOrSetterSelectorId);
|
|
sink.writeUInt30(metadata.getterSelectorId);
|
|
}
|
|
|
|
@override
|
|
ProcedureAttributesMetadata readFromBinary(Node node, BinarySource source) {
|
|
final int flags = source.readByte();
|
|
|
|
final bool methodOrSetterCalledDynamically =
|
|
(flags & kMethodOrSetterCalledDynamicallyBit) != 0;
|
|
final bool getterCalledDynamically =
|
|
(flags & kGetterCalledDynamicallyBit) != 0;
|
|
final bool hasThisUses = (flags & kThisUsesBit) != 0;
|
|
final bool hasNonThisUses = (flags & kNonThisUsesBit) != 0;
|
|
final bool hasTearOffUses = (flags & kTearOffUsesBit) != 0;
|
|
|
|
final int methodOrSetterSelectorId = source.readUInt30();
|
|
final int getterSelectorId = source.readUInt30();
|
|
|
|
return new ProcedureAttributesMetadata(
|
|
methodOrSetterCalledDynamically: methodOrSetterCalledDynamically,
|
|
getterCalledDynamically: getterCalledDynamically,
|
|
hasThisUses: hasThisUses,
|
|
hasNonThisUses: hasNonThisUses,
|
|
hasTearOffUses: hasTearOffUses,
|
|
methodOrSetterSelectorId: methodOrSetterSelectorId,
|
|
getterSelectorId: getterSelectorId);
|
|
}
|
|
}
|