7cd8fda37e
Also load/store canonical hashes in the heap for non-empty TypedData instances in the same manner as canonical hashes for Arrays. TEST=ci (refactoring only) Cq-Include-Trybots: luci.dart.try:vm-dyn-linux-debug-x64-try Change-Id: I54274b558fa9f0c8e304198b18cb3f0e9c3e0dfb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/504600 Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com>
71 lines
2.3 KiB
C++
71 lines
2.3 KiB
C++
// Copyright (c) 2016, 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.
|
|
|
|
#include "vm/token_position.h"
|
|
|
|
#include "vm/object.h"
|
|
#include "vm/zone_text_buffer.h"
|
|
|
|
namespace dart {
|
|
|
|
uword TokenPosition::Hash() const {
|
|
return Utils::WordHash(value_);
|
|
}
|
|
|
|
TokenPosition TokenPosition::Deserialize(int32_t value) {
|
|
return TokenPosition(value);
|
|
}
|
|
|
|
int32_t TokenPosition::Serialize() const {
|
|
return static_cast<int32_t>(value_);
|
|
}
|
|
|
|
intptr_t TokenPosition::EncodeCoveragePosition(bool is_branch_coverage) {
|
|
// Normal coverage positions are encoded as 2 * pos, and branch coverage are
|
|
// encoded as 2 * pos + 1.
|
|
intptr_t encoded_position =
|
|
2 * static_cast<intptr_t>(value_) + (is_branch_coverage ? 1 : 0);
|
|
// Coverage arrays are Uint32Arrays, so ensure the result fits.
|
|
ASSERT(Utils::IsUint(32, encoded_position));
|
|
return encoded_position;
|
|
}
|
|
|
|
TokenPosition TokenPosition::DecodeCoveragePosition(intptr_t encoded_position,
|
|
bool* is_branch_coverage) {
|
|
*is_branch_coverage = ((encoded_position % 2) == 1);
|
|
return TokenPosition(encoded_position / 2);
|
|
}
|
|
|
|
#define DEFINE_VALUES(name, value) \
|
|
const TokenPosition TokenPosition::k##name(value);
|
|
SENTINEL_TOKEN_DESCRIPTORS(DEFINE_VALUES);
|
|
#undef DEFINE_VALUES
|
|
const TokenPosition TokenPosition::kMinSource(kMinSourcePos);
|
|
const TokenPosition TokenPosition::kMaxSource(kMaxSourcePos);
|
|
|
|
const char* TokenPosition::ToCString() const {
|
|
switch (value_) {
|
|
#define DEFINE_CASE(name, value) \
|
|
case value: \
|
|
return #name;
|
|
SENTINEL_TOKEN_DESCRIPTORS(DEFINE_CASE);
|
|
#undef DEFINE_CASE
|
|
default:
|
|
break;
|
|
}
|
|
ASSERT(IsReal() || IsSynthetic());
|
|
ZoneTextBuffer buffer(Thread::Current()->zone());
|
|
int32_t encoded_value = value_;
|
|
if (IsSynthetic()) {
|
|
buffer.AddString("syn:");
|
|
// Use the decoded value for printing, so it can be more easily
|
|
// correlated with real token positions encoding the same source offset.
|
|
encoded_value = ConvertSynthetic(value_);
|
|
}
|
|
buffer.Printf("%" Pd32 "", encoded_value);
|
|
return buffer.buffer();
|
|
}
|
|
|
|
} // namespace dart
|