//===-- ScriptedProcessPythonInterface.h ------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTEDPROCESSPYTHONINTERFACE_H
#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTEDPROCESSPYTHONINTERFACE_H

#include "lldb/Host/Config.h"

#if LLDB_ENABLE_PYTHON

#include "lldb/Interpreter/ScriptedProcessInterface.h"

namespace lldb_private {
class ScriptInterpreterPythonImpl;
class ScriptedProcessPythonInterface : public ScriptedProcessInterface {
public:
  ScriptedProcessPythonInterface(ScriptInterpreterPythonImpl &interpreter)
      : ScriptedProcessInterface(), m_interpreter(interpreter) {}

  StructuredData::GenericSP
  CreatePluginObject(const llvm::StringRef class_name, lldb::TargetSP target_sp,
                     StructuredData::DictionarySP args_sp) override;

  Status Launch() override;

  Status Resume() override;

  lldb::MemoryRegionInfoSP
  GetMemoryRegionContainingAddress(lldb::addr_t address) override;

  StructuredData::DictionarySP GetThreadWithID(lldb::tid_t tid) override;

  StructuredData::DictionarySP GetRegistersForThread(lldb::tid_t tid) override;

  lldb::DataExtractorSP ReadMemoryAtAddress(lldb::addr_t address, size_t size,
                                            Status &error) override;

  StructuredData::DictionarySP GetLoadedImages() override;

  lldb::pid_t GetProcessID() override;

  bool IsAlive() override;

protected:
  size_t GetGenericInteger(llvm::StringRef method_name);
  Status LaunchOrResume(llvm::StringRef method_name);

private:
  // The lifetime is managed by the ScriptInterpreter
  ScriptInterpreterPythonImpl &m_interpreter;
  StructuredData::GenericSP m_object_instance_sp;
};
} // namespace lldb_private

#endif // LLDB_ENABLE_PYTHON
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTEDPROCESSPYTHONINTERFACE_H
