//===-- SBThread.cpp --------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/API/SBThread.h"

#include "lldb/API/SBSymbolContext.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBStream.h"
#include "lldb/Breakpoint/BreakpointLocation.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/State.h"
#include "lldb/Core/Stream.h"
#include "lldb/Core/StreamFile.h"
#include "lldb/Core/StructuredData.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Target/SystemRuntime.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/ThreadPlan.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/Queue.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Symbol/CompileUnit.h"
#include "lldb/Target/StopInfo.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/ThreadPlan.h"
#include "lldb/Target/ThreadPlanPython.h"
#include "lldb/Target/ThreadPlanStepInstruction.h"
#include "lldb/Target/ThreadPlanStepOut.h"
#include "lldb/Target/ThreadPlanStepRange.h"
#include "lldb/Target/ThreadPlanStepInRange.h"


#include "lldb/API/SBAddress.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBFrame.h"
#include "lldb/API/SBProcess.h"
#include "lldb/API/SBThreadPlan.h"
#include "lldb/API/SBValue.h"

using namespace lldb;
using namespace lldb_private;

//----------------------------------------------------------------------
// Constructors
//----------------------------------------------------------------------
SBThreadPlan::SBThreadPlan ()
{
}

SBThreadPlan::SBThreadPlan (const ThreadPlanSP& lldb_object_sp) :
    m_opaque_sp (lldb_object_sp)
{
}

SBThreadPlan::SBThreadPlan (const SBThreadPlan &rhs) :
    m_opaque_sp (rhs.m_opaque_sp)
{
    
}

SBThreadPlan::SBThreadPlan (lldb::SBThread &sb_thread, const char *class_name)
{
    Thread *thread = sb_thread.get();
    if (thread)
        m_opaque_sp.reset(new ThreadPlanPython(*thread, class_name));
}

//----------------------------------------------------------------------
// Assignment operator
//----------------------------------------------------------------------

const lldb::SBThreadPlan &
SBThreadPlan::operator = (const SBThreadPlan &rhs)
{
    if (this != &rhs)
        m_opaque_sp = rhs.m_opaque_sp;
    return *this;
}
//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
SBThreadPlan::~SBThreadPlan()
{
}

lldb_private::ThreadPlan *
SBThreadPlan::get()
{
    return m_opaque_sp.get();
}

bool
SBThreadPlan::IsValid() const
{
    return m_opaque_sp.get() != NULL;
}

void
SBThreadPlan::Clear ()
{
    m_opaque_sp.reset();
}

lldb::StopReason
SBThreadPlan::GetStopReason()
{
    return eStopReasonNone;
}

size_t
SBThreadPlan::GetStopReasonDataCount()
{
    return 0;
}

uint64_t
SBThreadPlan::GetStopReasonDataAtIndex(uint32_t idx)
{
    return 0;
}

SBThread
SBThreadPlan::GetThread () const
{
    if (m_opaque_sp)
    {
        return SBThread(m_opaque_sp->GetThread().shared_from_this());
    }
    else
        return SBThread();
}

bool
SBThreadPlan::GetDescription (lldb::SBStream &description) const
{
    if (m_opaque_sp)
    {
        m_opaque_sp->GetDescription(description.get(), eDescriptionLevelFull);
    }
    else
    {
        description.Printf("Empty SBThreadPlan");
    }
    return true;
}

void
SBThreadPlan::SetThreadPlan (const ThreadPlanSP& lldb_object_sp)
{
    m_opaque_sp = lldb_object_sp;
}

void
SBThreadPlan::SetPlanComplete (bool success)
{
    if (m_opaque_sp)
        m_opaque_sp->SetPlanComplete (success);
}

bool
SBThreadPlan::IsPlanComplete()
{
    if (m_opaque_sp)
        return m_opaque_sp->IsPlanComplete();
    else
        return true;
}

bool
SBThreadPlan::IsValid()
{
    if (m_opaque_sp)
        return m_opaque_sp->ValidatePlan(nullptr);
    else
        return false;
}

    // This section allows an SBThreadPlan to push another of the common types of plans...
    //
    // FIXME, you should only be able to queue thread plans from inside the methods of a
    // Scripted Thread Plan.  Need a way to enforce that.

SBThreadPlan
SBThreadPlan::QueueThreadPlanForStepOverRange (SBAddress &sb_start_address,
                                               lldb::addr_t size)
{
    if (m_opaque_sp)
    {
        Address *start_address = sb_start_address.get();
        if (!start_address)
        {
            return SBThreadPlan();
        }

        AddressRange range (*start_address, size);
        SymbolContext sc;
        start_address->CalculateSymbolContext(&sc);
        return SBThreadPlan (m_opaque_sp->GetThread().QueueThreadPlanForStepOverRange (false,
                                                                                      range,
                                                                                      sc,
                                                                                      eAllThreads));
    }
    else
    {
        return SBThreadPlan();
    }
}

SBThreadPlan
SBThreadPlan::QueueThreadPlanForStepInRange (SBAddress &sb_start_address,
                                               lldb::addr_t size)
{
    if (m_opaque_sp)
    {
        Address *start_address = sb_start_address.get();
        if (!start_address)
        {
            return SBThreadPlan();
        }

        AddressRange range (*start_address, size);
        SymbolContext sc;
        start_address->CalculateSymbolContext(&sc);
        return SBThreadPlan (m_opaque_sp->GetThread().QueueThreadPlanForStepInRange (false,
                                                                                      range,
                                                                                      sc,
                                                                                      NULL,
                                                                                      eAllThreads));
    }
    else
    {
        return SBThreadPlan();
    }
}

SBThreadPlan
SBThreadPlan::QueueThreadPlanForStepOut (uint32_t frame_idx_to_step_to, bool first_insn)
{
    if (m_opaque_sp)
    {
        SymbolContext sc;
        sc = m_opaque_sp->GetThread().GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
        return SBThreadPlan (m_opaque_sp->GetThread().QueueThreadPlanForStepOut (false,
                                                                                 &sc,
                                                                                 first_insn,
                                                                                 false,
                                                                                 eVoteYes,
                                                                                 eVoteNoOpinion,
                                                                                 frame_idx_to_step_to));
    }
    else
    {
        return SBThreadPlan();
    }
}

SBThreadPlan
SBThreadPlan::QueueThreadPlanForRunToAddress (SBAddress sb_address)
{
    if (m_opaque_sp)
    {
        Address *address = sb_address.get();
        if (!address)
            return SBThreadPlan();

        return SBThreadPlan (m_opaque_sp->GetThread().QueueThreadPlanForRunToAddress (false,
                                                                                      *address,
                                                                                      false));
    }
    else
    {
        return SBThreadPlan();
    }
}


