Fixes the case where we created a dummy target, deleted it, and then tried to evaluate an expression with no target.

llvm-svn: 157110
This commit is contained in:
Filipe Cabecinhas 2012-05-19 09:59:08 +00:00
parent 6166178573
commit 721ba3ff77
4 changed files with 25 additions and 12 deletions

View File

@ -414,6 +414,12 @@ public:
const lldb::ProcessSP &
GetProcessSP () const;
bool
IsValid()
{
return m_valid;
}
void
Destroy();
@ -1156,6 +1162,7 @@ protected:
// we can correctly tear down everything that we need to, so the only
// class that knows about the process lifespan is this target class.
lldb::ProcessSP m_process_sp;
bool m_valid;
lldb::SearchFilterSP m_search_filter_sp;
PathMappingList m_image_search_paths;
std::auto_ptr<ClangASTContext> m_scratch_ast_context_ap;

View File

@ -502,7 +502,7 @@ SBTarget::GetBroadcasterClassName ()
bool
SBTarget::IsValid () const
{
return m_opaque_sp.get() != NULL;
return m_opaque_sp.get() != NULL && m_opaque_sp->IsValid();
}
SBProcess

View File

@ -1227,19 +1227,23 @@ Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
lldb::TargetSP
Host::GetDummyTarget (lldb_private::Debugger &debugger)
{
lldb::TargetSP dummy_target_sp;
static TargetSP g_dummy_target_sp;
ArchSpec arch(Target::GetDefaultArchitecture());
if (!arch.IsValid())
arch = Host::GetArchitecture ();
Error err = debugger.GetTargetList().CreateTarget(debugger,
FileSpec(),
arch.GetTriple().getTriple().c_str(),
false,
NULL,
dummy_target_sp);
// FIXME: Maybe the dummy target should be per-Debugger
if (!g_dummy_target_sp || !g_dummy_target_sp->IsValid())
{
ArchSpec arch(Target::GetDefaultArchitecture());
if (!arch.IsValid())
arch = Host::GetArchitecture ();
Error err = debugger.GetTargetList().CreateTarget(debugger,
FileSpec(),
arch.GetTriple().getTriple().c_str(),
false,
NULL,
g_dummy_target_sp);
}
return dummy_target_sp;
return g_dummy_target_sp;
}
struct ShellInfo

View File

@ -64,6 +64,7 @@ Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::Plat
m_internal_breakpoint_list (true),
m_watchpoint_list (),
m_process_sp (),
m_valid (true),
m_search_filter_sp (),
m_image_search_paths (ImageSearchPathsChanged, this),
m_scratch_ast_context_ap (NULL),
@ -165,6 +166,7 @@ void
Target::Destroy()
{
Mutex::Locker locker (m_mutex);
m_valid = false;
DeleteCurrentProcess ();
m_platform_sp.reset();
m_arch.Clear();