dart-sdk/runtime/vm/token_position.cc
Liam Appelbe a9b33cfcd2 [vm] Change the encoding of token positions in the coverage array
The source report RPC needs to be able to distinguish branch coverage vs
normal coverage token positions. So encode normal positions as 2 * pos
and branch positions as 2 * pos + 1.

TEST=CI

Change-Id: I247796d1eb4c97947f9b38aa56bc318ecea09425
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/224320
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Liam Appelbe <liama@google.com>
2021-12-15 23:12:19 +00:00

64 lines
2 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_);
return is_branch_coverage ? encoded_position + 1 : 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());
if (IsSynthetic()) {
buffer.AddString("syn:");
}
buffer.Printf("%" Pd32 "", value_);
return buffer.buffer();
}
} // namespace dart