| //===-- 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() : |
| m_target_sp (), |
| m_process_sp (), |
| m_thread_sp (), |
| m_frame_sp () |
| { |
| } |
| |
| ExecutionContext::ExecutionContext (const ExecutionContext &rhs) : |
| m_target_sp (rhs.m_target_sp), |
| m_process_sp(rhs.m_process_sp), |
| m_thread_sp (rhs.m_thread_sp), |
| m_frame_sp (rhs.m_frame_sp) |
| { |
| } |
| |
| ExecutionContext & |
| ExecutionContext::operator =(const ExecutionContext &rhs) |
| { |
| if (this != &rhs) |
| { |
| m_target_sp = rhs.m_target_sp; |
| m_process_sp = rhs.m_process_sp; |
| m_thread_sp = rhs.m_thread_sp; |
| m_frame_sp = rhs.m_frame_sp; |
| } |
| return *this; |
| } |
| |
| ExecutionContext::ExecutionContext (Target* t, bool fill_current_process_thread_frame) : |
| m_target_sp (t->shared_from_this()), |
| m_process_sp (), |
| m_thread_sp (), |
| m_frame_sp () |
| { |
| if (t && fill_current_process_thread_frame) |
| { |
| m_process_sp = t->GetProcessSP(); |
| if (m_process_sp) |
| { |
| m_thread_sp = m_process_sp->GetThreadList().GetSelectedThread(); |
| if (m_thread_sp) |
| m_frame_sp = m_thread_sp->GetSelectedFrame(); |
| } |
| } |
| } |
| |
| ExecutionContext::ExecutionContext(Process* process, Thread *thread, StackFrame *frame) : |
| m_target_sp (), |
| m_process_sp (process->shared_from_this()), |
| m_thread_sp (thread->shared_from_this()), |
| m_frame_sp (frame->shared_from_this()) |
| { |
| if (process) |
| m_target_sp = process->GetTarget().shared_from_this(); |
| } |
| |
| ExecutionContext::ExecutionContext (ExecutionContextScope *exe_scope_ptr) |
| { |
| if (exe_scope_ptr) |
| exe_scope_ptr->CalculateExecutionContext (*this); |
| else |
| { |
| m_target_sp.reset(); |
| m_process_sp.reset(); |
| m_thread_sp.reset(); |
| m_frame_sp.reset(); |
| } |
| } |
| |
| ExecutionContext::ExecutionContext (ExecutionContextScope &exe_scope_ref) |
| { |
| exe_scope_ref.CalculateExecutionContext (*this); |
| } |
| |
| void |
| ExecutionContext::Clear() |
| { |
| m_target_sp.reset(); |
| m_process_sp.reset(); |
| m_thread_sp.reset(); |
| m_frame_sp.reset(); |
| } |
| |
| ExecutionContext::~ExecutionContext() |
| { |
| } |
| |
| |
| RegisterContext * |
| ExecutionContext::GetRegisterContext () const |
| { |
| if (m_frame_sp) |
| return m_frame_sp->GetRegisterContext().get(); |
| else if (m_thread_sp) |
| return m_thread_sp->GetRegisterContext().get(); |
| return NULL; |
| } |
| |
| Target * |
| ExecutionContext::GetTargetPtr () const |
| { |
| if (m_target_sp) |
| return m_target_sp.get(); |
| if (m_process_sp) |
| return &m_process_sp->GetTarget(); |
| return NULL; |
| } |
| |
| Process * |
| ExecutionContext::GetProcessPtr () const |
| { |
| if (m_process_sp) |
| return m_process_sp.get(); |
| if (m_target_sp) |
| return m_target_sp->GetProcessSP().get(); |
| return NULL; |
| } |
| |
| ExecutionContextScope * |
| ExecutionContext::GetBestExecutionContextScope () const |
| { |
| if (m_frame_sp) |
| return m_frame_sp.get(); |
| if (m_thread_sp) |
| return m_thread_sp.get(); |
| if (m_process_sp) |
| return m_process_sp.get(); |
| return m_target_sp.get(); |
| } |
| |
| Target & |
| ExecutionContext::GetTargetRef () const |
| { |
| assert (m_target_sp.get()); |
| return *m_target_sp; |
| } |
| |
| Process & |
| ExecutionContext::GetProcessRef () const |
| { |
| assert (m_process_sp.get()); |
| return *m_process_sp; |
| } |
| |
| Thread & |
| ExecutionContext::GetThreadRef () const |
| { |
| assert (m_thread_sp.get()); |
| return *m_thread_sp; |
| } |
| |
| StackFrame & |
| ExecutionContext::GetFrameRef () const |
| { |
| assert (m_frame_sp.get()); |
| return *m_frame_sp; |
| } |
| |
| void |
| ExecutionContext::SetTargetSP (const lldb::TargetSP &target_sp) |
| { |
| m_target_sp = target_sp; |
| } |
| |
| void |
| ExecutionContext::SetProcessSP (const lldb::ProcessSP &process_sp) |
| { |
| m_process_sp = process_sp; |
| } |
| |
| void |
| ExecutionContext::SetThreadSP (const lldb::ThreadSP &thread_sp) |
| { |
| m_thread_sp = thread_sp; |
| } |
| |
| void |
| ExecutionContext::SetFrameSP (const lldb::StackFrameSP &frame_sp) |
| { |
| m_frame_sp = frame_sp; |
| } |
| |
| void |
| ExecutionContext::SetTargetPtr (Target* target) |
| { |
| if (target) |
| m_target_sp = target->shared_from_this(); |
| else |
| m_target_sp.reset(); |
| } |
| |
| void |
| ExecutionContext::SetProcessPtr (Process *process) |
| { |
| if (process) |
| m_process_sp = process->shared_from_this(); |
| else |
| m_process_sp.reset(); |
| } |
| |
| void |
| ExecutionContext::SetThreadPtr (Thread *thread) |
| { |
| if (thread) |
| m_thread_sp = thread->shared_from_this(); |
| else |
| m_thread_sp.reset(); |
| } |
| |
| void |
| ExecutionContext::SetFramePtr (StackFrame *frame) |
| { |
| if (frame) |
| m_frame_sp = frame->shared_from_this(); |
| else |
| m_frame_sp.reset(); |
| } |
| |