// 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(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(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