Fix issues with CreateInstanceName, a virtual function, being called
in an initializer.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@114107 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Core/Debugger.cpp b/source/Core/Debugger.cpp
index 4082204..8fd0271 100644
--- a/source/Core/Debugger.cpp
+++ b/source/Core/Debugger.cpp
@@ -639,13 +639,20 @@
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/source/Core/UserSettingsController.cpp b/source/Core/UserSettingsController.cpp
index b97aa1d..4a604ca 100644
--- a/source/Core/UserSettingsController.cpp
+++ b/source/Core/UserSettingsController.cpp
@@ -2187,6 +2187,7 @@
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 @@
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/source/Target/Process.cpp b/source/Target/Process.cpp
index c86b74c..a9f6d55 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -1876,7 +1876,7 @@
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 @@
// 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/source/Target/Thread.cpp b/source/Target/Thread.cpp
index 7fa6491..9bc244b 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -967,12 +967,19 @@
//--------------------------------------------------------------
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)
{