// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/zxdb/client/breakpoint_location_impl.h"

#include "src/developer/debug/zxdb/client/breakpoint_impl.h"
#include "src/developer/debug/zxdb/client/process.h"
#include "src/developer/debug/zxdb/symbols/process_symbols.h"

namespace zxdb {

BreakpointLocationImpl::BreakpointLocationImpl(BreakpointImpl* bp, Process* process,
                                               uint64_t address)
    : breakpoint_(bp), process_(process), address_(address) {}

BreakpointLocationImpl::~BreakpointLocationImpl() = default;

Process* BreakpointLocationImpl::GetProcess() const { return process_; }

Location BreakpointLocationImpl::GetLocation() const {
  // This isn't cached because it isn't needed so often and it will take extra work to handle module
  // loads and unloads for the cache.
  auto vect = process_->GetSymbols()->ResolveInputLocation(InputLocation(address_));
  // Resolving an address should always produce one result.
  FX_DCHECK(vect.size() == 1u);
  return std::move(vect[0]);
}

bool BreakpointLocationImpl::IsEnabled() const { return enabled_; }

void BreakpointLocationImpl::SetEnabled(bool enabled) {
  if (enabled_ == enabled)
    return;

  enabled_ = enabled;
  breakpoint_->DidChangeLocation();
}

}  // namespace zxdb
