From 9e41c15d8484ec71b31bb791bac3d3b41719bf5f Mon Sep 17 00:00:00 2001 From: Caroline Tice Date: Thu, 16 Sep 2010 19:05:55 +0000 Subject: [PATCH] Fix issues with CreateInstanceName, a virtual function, being called in an initializer. llvm-svn: 114107 --- lldb/include/lldb/Core/UserSettingsController.h | 3 +++ lldb/source/Core/Debugger.cpp | 9 ++++++++- lldb/source/Core/UserSettingsController.cpp | 9 +++++++++ lldb/source/Target/Process.cpp | 9 ++++++++- lldb/source/Target/Thread.cpp | 9 ++++++++- 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lldb/include/lldb/Core/UserSettingsController.h b/lldb/include/lldb/Core/UserSettingsController.h index c2d44116bbe5..8812cc02dcb9 100644 --- a/lldb/include/lldb/Core/UserSettingsController.h +++ b/lldb/include/lldb/Core/UserSettingsController.h @@ -392,6 +392,9 @@ public: static const ConstString & GetDefaultName (); + static const ConstString & + InvalidName (); + protected: UserSettingsController &m_owner; diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 408220437b6d..8fd0271241ab 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -639,13 +639,20 @@ Debugger::DebuggerInstanceSettings::ValidTermWidthValue (const char *value, Erro DebuggerInstanceSettings::DebuggerInstanceSettings (UserSettingsController &owner, bool live_instance, const char *name) : - InstanceSettings (owner, (name == NULL ? CreateInstanceName ().AsCString() : name), live_instance), + InstanceSettings (owner, (name == NULL ? InstanceSettings::InvalidName().AsCString() : name), live_instance), m_prompt (), m_script_lang () { // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called // until the vtables for DebuggerInstanceSettings are properly set up, i.e. AFTER all the initializers. // For this reason it has to be called here, rather than in the initializer or in the parent constructor. + // The same is true of CreateInstanceName(). + + if (GetInstanceName() == InstanceSettings::InvalidName()) + { + ChangeInstanceName (std::string (CreateInstanceName().AsCString())); + m_owner.RegisterInstanceSettings (this); + } if (live_instance) { diff --git a/lldb/source/Core/UserSettingsController.cpp b/lldb/source/Core/UserSettingsController.cpp index b97aa1d7ea76..4a604cac38bb 100644 --- a/lldb/source/Core/UserSettingsController.cpp +++ b/lldb/source/Core/UserSettingsController.cpp @@ -2187,6 +2187,7 @@ InstanceSettings::InstanceSettings (UserSettingsController &owner, const char *i m_instance_name (instance_name) { if ((m_instance_name != InstanceSettings::GetDefaultName()) + && (m_instance_name != InstanceSettings::InvalidName()) && live_instance) m_owner.RegisterInstanceSettings (this); } @@ -2205,6 +2206,14 @@ InstanceSettings::GetDefaultName () return g_default_settings_name; } +const ConstString & +InstanceSettings::InvalidName () +{ + static const ConstString g_invalid_name ("Invalid instance name"); + + return g_invalid_name; +} + void InstanceSettings::ChangeInstanceName (const std::string &new_instance_name) { diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index c86b74cc77f9..a9f6d55fd792 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1876,7 +1876,7 @@ Process::ProcessSettingsController::CreateNewInstanceSettings (const char *insta ProcessInstanceSettings::ProcessInstanceSettings (UserSettingsController &owner, bool live_instance, const char *name) : - InstanceSettings (owner, (name == NULL ? CreateInstanceName().AsCString() : name), live_instance), + InstanceSettings (owner, (name == NULL ? InstanceSettings::InvalidName().AsCString() : name), live_instance), m_run_args (), m_env_vars (), m_input_path (), @@ -1888,6 +1888,13 @@ ProcessInstanceSettings::ProcessInstanceSettings (UserSettingsController &owner, // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers. // For this reason it has to be called here, rather than in the initializer or in the parent constructor. + // This is true for CreateInstanceName() too. + + if (GetInstanceName () == InstanceSettings::InvalidName()) + { + ChangeInstanceName (std::string (CreateInstanceName().AsCString())); + m_owner.RegisterInstanceSettings (this); + } if (live_instance) { diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 7fa64912a978..9bc244bd155f 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -967,12 +967,19 @@ Thread::ThreadSettingsController::CreateNewInstanceSettings (const char *instanc //-------------------------------------------------------------- ThreadInstanceSettings::ThreadInstanceSettings (UserSettingsController &owner, bool live_instance, const char *name) : - InstanceSettings (owner, (name == NULL ? CreateInstanceName().AsCString() : name), live_instance), + InstanceSettings (owner, (name == NULL ? InstanceSettings::InvalidName().AsCString() : name), live_instance), m_avoid_regexp_ap () { // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called // until the vtables for ThreadInstanceSettings are properly set up, i.e. AFTER all the initializers. // For this reason it has to be called here, rather than in the initializer or in the parent constructor. + // This is true for CreateInstanceName() too. + + if (GetInstanceName() == InstanceSettings::InvalidName()) + { + ChangeInstanceName (std::string (CreateInstanceName().AsCString())); + m_owner.RegisterInstanceSettings (this); + } if (live_instance) {