Files
sdk/pkg/vm/lib/metadata/unboxing_info.dart
T
Johnni Winther 79f36c9d49 [kernel] Rename readUInt to readUInt30 to match corresponding write-method.
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>
2020-11-24 08:50:38 +00:00

101 lines
2.8 KiB
Dart

// Copyright (c) 2020, 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.
import 'package:kernel/ast.dart';
class UnboxingInfoMetadata {
static const kBoxed = 0;
static const kUnboxedIntCandidate = 1 << 0;
static const kUnboxedDoubleCandidate = 1 << 1;
static const kUnboxingCandidate =
kUnboxedIntCandidate | kUnboxedDoubleCandidate;
final List<int> unboxedArgsInfo;
int returnInfo;
UnboxingInfoMetadata(int argsLen) : unboxedArgsInfo = [] {
for (int i = 0; i < argsLen; i++) {
unboxedArgsInfo.add(kUnboxingCandidate);
}
returnInfo = kUnboxingCandidate;
}
UnboxingInfoMetadata.readFromBinary(BinarySource source)
: unboxedArgsInfo = List<int>.generate(
source.readUInt30(), (_) => source.readByte(),
growable: true),
returnInfo = source.readByte();
// Returns `true` if all arguments as well as the return value have to be
// boxed.
//
// We don't have to write out metadata for fully boxed methods, because this
// is the default.
bool get isFullyBoxed {
if (returnInfo != kBoxed) return false;
for (int argInfo in unboxedArgsInfo) {
if (argInfo != kBoxed) return false;
}
return true;
}
void writeToBinary(BinarySink sink) {
sink.writeUInt30(unboxedArgsInfo.length);
for (int val in unboxedArgsInfo) {
sink.writeByte(val);
}
sink.writeByte(returnInfo);
}
@override
String toString() {
final sb = StringBuffer();
sb.write('(');
for (int i = 0; i < unboxedArgsInfo.length; ++i) {
final argInfo = unboxedArgsInfo[i];
sb.write(_stringifyUnboxingInfo(argInfo));
if (i != (unboxedArgsInfo.length - 1)) {
sb.write(',');
}
}
sb.write(')');
sb.write('->');
sb.write(_stringifyUnboxingInfo(returnInfo));
return sb.toString();
}
static String _stringifyUnboxingInfo(int info) {
if (info == UnboxingInfoMetadata.kUnboxedIntCandidate) {
return 'i';
} else if (info == UnboxingInfoMetadata.kUnboxedDoubleCandidate) {
return 'd';
}
assert(info == 0);
return 'b';
}
}
class UnboxingInfoMetadataRepository
extends MetadataRepository<UnboxingInfoMetadata> {
static const repositoryTag = 'vm.unboxing-info.metadata';
@override
final String tag = repositoryTag;
@override
final Map<TreeNode, UnboxingInfoMetadata> mapping =
<TreeNode, UnboxingInfoMetadata>{};
@override
void writeToBinary(
UnboxingInfoMetadata metadata, Node node, BinarySink sink) {
metadata.writeToBinary(sink);
}
@override
UnboxingInfoMetadata readFromBinary(Node node, BinarySource source) {
return UnboxingInfoMetadata.readFromBinary(source);
}
}