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

#pragma once

#include <memory>
#include <optional>

#include "garnet/bin/zxdb/client/frame.h"
#include "garnet/bin/zxdb/symbols/location.h"
#include "garnet/lib/debug_ipc/records.h"
#include "lib/fxl/memory/ref_counted.h"

namespace zxdb {

class DwarfExprEval;
class FrameSymbolDataProvider;
class SymbolEvalContext;
class Thread;

// A frame is lazily symbolized.
class FrameImpl final : public Frame {
 public:
  FrameImpl(Thread* thread, const debug_ipc::StackFrame& stack_frame,
            Location location);
  ~FrameImpl() override;

  // Frame implementation.
  Thread* GetThread() const override;
  bool IsInline() const override;
  const Frame* GetPhysicalFrame() const override;
  const Location& GetLocation() const override;
  uint64_t GetAddress() const override;
  uint64_t GetBasePointerRegister() const override;
  std::optional<uint64_t> GetBasePointer() const override;
  void GetBasePointerAsync(std::function<void(uint64_t bp)> cb) override;
  uint64_t GetStackPointer() const override;
  fxl::RefPtr<SymbolDataProvider> GetSymbolDataProvider() const override;
  fxl::RefPtr<ExprEvalContext> GetExprEvalContext() const override;

 private:
  void EnsureSymbolized() const;

  // Ensures that the base pointer evaluation has at least started. If this
  // returns true the computed_base_pointer_ is valid and can be used. If this
  // returns false, the computation of the base pointer will be pending.
  // Callers can add a callback to base_pointer_requests_ to be notified when
  // computation is done.
  bool EnsureBasePointer();

  Thread* thread_;

  // This stack frame contains the base pointer computed by the backend which
  // is not necessarily the frame base (see GetBasePointer() declaration).
  debug_ipc::StackFrame stack_frame_;

  mutable Location location_;  // Lazily symbolized.
  mutable fxl::RefPtr<FrameSymbolDataProvider> symbol_data_provider_;  // Lazy.
  mutable fxl::RefPtr<SymbolEvalContext> symbol_eval_context_;         // Lazy.

  // The lazily computed frame base. This will be from DW_AT_frame_base on the
  // function if there is one, or the BP from the stack_frame_ if not.
  std::optional<uint64_t> computed_base_pointer_;

  // Non-null when evaluating a frame base pointer expression.
  std::unique_ptr<DwarfExprEval> base_pointer_eval_;

  // When an async base pointer request is pending, this maintains all
  // pending callbacks.
  std::vector<std::function<void(uint64_t)>> base_pointer_requests_;

  FXL_DISALLOW_COPY_AND_ASSIGN(FrameImpl);
};

}  // namespace zxdb
