//===-- SBExecutionContext.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/SBExecutionContext.h"

#include "lldb/API/SBTarget.h"
#include "lldb/API/SBProcess.h"
#include "lldb/API/SBThread.h"
#include "lldb/API/SBFrame.h"

#include "lldb/Target/ExecutionContext.h"

using namespace lldb;
using namespace lldb_private;

SBExecutionContext::SBExecutionContext() :
m_exe_ctx_sp()
{
}

SBExecutionContext::SBExecutionContext (const lldb::SBExecutionContext &rhs) :
m_exe_ctx_sp(rhs.m_exe_ctx_sp)
{
}

SBExecutionContext::SBExecutionContext (lldb::ExecutionContextRefSP exe_ctx_ref_sp) :
m_exe_ctx_sp(exe_ctx_ref_sp)
{
}

SBExecutionContext::SBExecutionContext (const lldb::SBTarget &target) :
m_exe_ctx_sp(new ExecutionContextRef())
{
    m_exe_ctx_sp->SetTargetSP(target.GetSP());
}

SBExecutionContext::SBExecutionContext (const lldb::SBProcess &process) :
m_exe_ctx_sp(new ExecutionContextRef())
{
    m_exe_ctx_sp->SetProcessSP(process.GetSP());
}

SBExecutionContext::SBExecutionContext (lldb::SBThread thread) :
m_exe_ctx_sp(new ExecutionContextRef())
{
    m_exe_ctx_sp->SetThreadPtr(thread.get());
}

SBExecutionContext::SBExecutionContext (const lldb::SBFrame &frame) :
m_exe_ctx_sp(new ExecutionContextRef())
{
    m_exe_ctx_sp->SetFrameSP(frame.GetFrameSP());
}

SBExecutionContext::~SBExecutionContext()
{
}

const SBExecutionContext &
SBExecutionContext::operator = (const lldb::SBExecutionContext &rhs)
{
    m_exe_ctx_sp = rhs.m_exe_ctx_sp;
    return *this;
}

ExecutionContextRef *
SBExecutionContext::get () const
{
    return m_exe_ctx_sp.get();
}

SBTarget
SBExecutionContext::GetTarget () const
{
    SBTarget sb_target;
    if (m_exe_ctx_sp)
    {
        TargetSP target_sp(m_exe_ctx_sp->GetTargetSP());
        if (target_sp)
            sb_target.SetSP(target_sp);
    }
    return sb_target;
}

SBProcess
SBExecutionContext::GetProcess () const
{
    SBProcess sb_process;
    if (m_exe_ctx_sp)
    {
        ProcessSP process_sp(m_exe_ctx_sp->GetProcessSP());
        if (process_sp)
            sb_process.SetSP(process_sp);
    }
    return sb_process;
}

SBThread
SBExecutionContext::GetThread () const
{
    SBThread sb_thread;
    if (m_exe_ctx_sp)
    {
        ThreadSP thread_sp(m_exe_ctx_sp->GetThreadSP());
        if (thread_sp)
            sb_thread.SetThread(thread_sp);
    }
    return sb_thread;
}

SBFrame
SBExecutionContext::GetFrame () const
{
    SBFrame sb_frame;
    if (m_exe_ctx_sp)
    {
        StackFrameSP frame_sp(m_exe_ctx_sp->GetFrameSP());
        if (frame_sp)
            sb_frame.SetFrameSP(frame_sp);
    }
    return sb_frame;
}

