diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index d4b9bf6c37c9..304ee119198f 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -633,11 +633,15 @@ DebuggerInstanceSettings::DebuggerInstanceSettings (UserSettingsController &owne m_prompt (), m_script_lang () { - if (name == NULL && live_instance) + // 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. + + if (live_instance) { const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); CopyInstanceSettings (pending_settings, false); - m_owner.RemovePendingSettings (m_instance_name); + //m_owner.RemovePendingSettings (m_instance_name); } } diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 565e78418814..1519e1f01f41 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1974,7 +1974,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 ? CreateInstanceName().AsCString() : name), live_instance), m_run_args (), m_env_vars (), m_input_path (), @@ -1983,11 +1983,15 @@ ProcessInstanceSettings::ProcessInstanceSettings (UserSettingsController &owner, m_plugin (), m_disable_aslr (true) { - if (m_instance_name != InstanceSettings::GetDefaultName() && live_instance) + // 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. + + if (live_instance) { const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); CopyInstanceSettings (pending_settings,false); - m_owner.RemovePendingSettings (m_instance_name); + //m_owner.RemovePendingSettings (m_instance_name); } } diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 422257f8ad02..7fa64912a978 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -970,13 +970,15 @@ ThreadInstanceSettings::ThreadInstanceSettings (UserSettingsController &owner, b InstanceSettings (owner, (name == NULL ? CreateInstanceName().AsCString() : name), live_instance), m_avoid_regexp_ap () { - // FIXME: This seems like generic code, why was it duplicated (with the slight difference that - // DebuggerInstanceSettings checks name, not m_instance_name below) in Process & Debugger? - if (m_instance_name != InstanceSettings::GetDefaultName() && live_instance) + // 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. + + if (live_instance) { const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); CopyInstanceSettings (pending_settings,false); - m_owner.RemovePendingSettings (m_instance_name); + //m_owner.RemovePendingSettings (m_instance_name); } }