//===-- ExecutionContext.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/Target/ExecutionContext.h"
#include "lldb/Target/ExecutionContextScope.h"
#include "lldb/Target/StackFrame.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/Thread.h"

using namespace lldb_private;

ExecutionContext::ExecutionContext() :
    target (NULL),
    process (NULL),
    thread (NULL),
    frame (NULL)
{
}

ExecutionContext::ExecutionContext (Target* t, bool fill_current_process_thread_frame) :
    target (t),
    process (NULL),
    thread (NULL),
    frame (NULL)
{
    if (t && fill_current_process_thread_frame)
    {
        process = t->GetProcessSP().get();
        if (process)
        {
            thread = process->GetThreadList().GetSelectedThread().get();
            if (thread)
                frame = thread->GetSelectedFrame().get();
        }
    }
}

ExecutionContext::ExecutionContext(Process* p, Thread *t, StackFrame *f) :
    target (p ? &p->GetTarget() : NULL),
    process (p),
    thread (t),
    frame (f)
{
}

ExecutionContext::ExecutionContext (ExecutionContextScope *exe_scope_ptr)
{
    if (exe_scope_ptr)
        exe_scope_ptr->CalculateExecutionContext (*this);
    else
    {
        target  = NULL;
        process = NULL;
        thread  = NULL;
        frame   = NULL;
    }
}

ExecutionContext::ExecutionContext (ExecutionContextScope &exe_scope_ref)
{
    exe_scope_ref.CalculateExecutionContext (*this);
}

void
ExecutionContext::Clear()
{
    target  = NULL;
    process = NULL;
    thread  = NULL;
    frame   = NULL;
}


RegisterContext *
ExecutionContext::GetRegisterContext () const
{
    if (frame)
        return frame->GetRegisterContext().get();
    else if (thread)
        return thread->GetRegisterContext().get();
    return NULL;
}

ExecutionContextScope *
ExecutionContext::GetBestExecutionContextScope () const
{
    if (frame)
        return frame;
    if (thread)
        return thread;
    if (process)
        return process;
    return target;
}
