summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-03-06 00:05:55 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-03-06 00:05:55 +0000
commitbd4bf82a48c2b5b632766593916f8d7ea98c9e0a (patch)
treee5f6caca722bc0bc82e5d5da97bc1a5a873253a0 /lldb
parentd823020bacb105ce45c6207f108b80683c3f77af (diff)
downloadbcm5719-llvm-bd4bf82a48c2b5b632766593916f8d7ea98c9e0a.tar.gz
bcm5719-llvm-bd4bf82a48c2b5b632766593916f8d7ea98c9e0a.zip
[SBAPI] Don't check IsValid in constructor
When running the test suite with the instrumentation macros, I noticed two lldb-mi tests regressed. The issue was the copy constructor of SBLineEntry. Without the macros the returned value would be elided, but with the macros the copy constructor was called. The latter using ::IsValid to determine whether the underlying opaque pointer should be set. This is likely a remnant of when ::IsValid would only check the validity of the smart pointer. In SBLineEntry however, it actually forwards to LineEntry::IsValid(). So what happened here was that because of the macros the copy constructor was called. The opaque pointer was valid but the LineEntry didn't consider itself valid. So the copied-to object ended up default initialized. This patch replaces all checks for IsValid in copy (assignment) constructors with checks for the opaque pointer itself. Differential revision: https://reviews.llvm.org/D58946 llvm-svn: 355458
Diffstat (limited to 'lldb')
-rw-r--r--lldb/lldb.xcodeproj/project.pbxproj2
-rw-r--r--lldb/source/API/SBAddress.cpp14
-rw-r--r--lldb/source/API/SBAttachInfo.cpp6
-rw-r--r--lldb/source/API/SBCommandReturnObject.cpp13
-rw-r--r--lldb/source/API/SBDeclaration.cpp14
-rw-r--r--lldb/source/API/SBError.cpp14
-rw-r--r--lldb/source/API/SBExpressionOptions.cpp13
-rw-r--r--lldb/source/API/SBFileSpec.cpp8
-rw-r--r--lldb/source/API/SBFileSpecList.cpp9
-rw-r--r--lldb/source/API/SBFrame.cpp8
-rw-r--r--lldb/source/API/SBLineEntry.cpp20
-rw-r--r--lldb/source/API/SBMemoryRegionInfo.cpp10
-rw-r--r--lldb/source/API/SBModuleSpec.cpp8
-rw-r--r--lldb/source/API/SBProcessInfo.cpp14
-rw-r--r--lldb/source/API/SBStringList.cpp15
-rw-r--r--lldb/source/API/SBSymbolContext.cpp29
-rw-r--r--lldb/source/API/SBSymbolContextList.cpp11
-rw-r--r--lldb/source/API/SBThread.cpp26
-rw-r--r--lldb/source/API/SBTypeEnumMember.cpp13
-rw-r--r--lldb/source/API/SBTypeSummary.cpp11
-rw-r--r--lldb/source/API/Utils.h30
21 files changed, 138 insertions, 150 deletions
diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj
index 4d5fab8b589..72615284370 100644
--- a/lldb/lldb.xcodeproj/project.pbxproj
+++ b/lldb/lldb.xcodeproj/project.pbxproj
@@ -3238,6 +3238,7 @@
9A4633DA11F65D8600955CE1 /* UserSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UserSettingsController.h; path = include/lldb/Core/UserSettingsController.h; sourceTree = "<group>"; };
4C00833F1B9F9BA900D5CF24 /* UtilityFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = UtilityFunction.cpp; path = source/Expression/UtilityFunction.cpp; sourceTree = "<group>"; };
4C00833D1B9F9B8400D5CF24 /* UtilityFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UtilityFunction.h; path = include/lldb/Expression/UtilityFunction.h; sourceTree = "<group>"; };
+ DD54302F222F190D00C1F021 /* Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = source/API/Utils.h; sourceTree = "<group>"; };
2654A6921E552F4600DA1013 /* VASPrintf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = VASPrintf.h; path = include/lldb/Utility/VASPrintf.h; sourceTree = "<group>"; };
2654A68F1E552ED500DA1013 /* VASprintf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VASprintf.cpp; path = source/Utility/VASprintf.cpp; sourceTree = "<group>"; };
9A3D43C41F3150D200EB767C /* VASprintfTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VASprintfTest.cpp; sourceTree = "<group>"; };
@@ -4442,6 +4443,7 @@
23059A0F1958B319007B8189 /* SBUnixSignals.cpp */,
9A19A6A51163BB7E00E0D453 /* SBValue.h */,
9A19A6AD1163BB9800E0D453 /* SBValue.cpp */,
+ DD54302F222F190D00C1F021 /* Utils.h */,
9A357582116CFDEE00E8ED2F /* SBValueList.h */,
9A35758D116CFE0F00E8ED2F /* SBValueList.cpp */,
94235B9A1A8D5FD800EB2EED /* SBVariablesOptions.h */,
diff --git a/lldb/source/API/SBAddress.cpp b/lldb/source/API/SBAddress.cpp
index 2765a7f1439..e7dcbd30c0d 100644
--- a/lldb/source/API/SBAddress.cpp
+++ b/lldb/source/API/SBAddress.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBAddress.h"
+#include "Utils.h"
#include "lldb/API/SBProcess.h"
#include "lldb/API/SBSection.h"
#include "lldb/API/SBStream.h"
@@ -25,12 +26,11 @@ SBAddress::SBAddress() : m_opaque_up(new Address()) {}
SBAddress::SBAddress(const Address *lldb_object_ptr)
: m_opaque_up(new Address()) {
if (lldb_object_ptr)
- ref() = *lldb_object_ptr;
+ m_opaque_up = llvm::make_unique<Address>(*lldb_object_ptr);
}
SBAddress::SBAddress(const SBAddress &rhs) : m_opaque_up(new Address()) {
- if (rhs.IsValid())
- ref() = rhs.ref();
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBAddress::SBAddress(lldb::SBSection section, lldb::addr_t offset)
@@ -45,12 +45,8 @@ SBAddress::SBAddress(lldb::addr_t load_addr, lldb::SBTarget &target)
SBAddress::~SBAddress() {}
const SBAddress &SBAddress::operator=(const SBAddress &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- ref() = rhs.ref();
- else
- m_opaque_up.reset(new Address());
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBAttachInfo.cpp b/lldb/source/API/SBAttachInfo.cpp
index 12f63b858a6..c51964bed70 100644
--- a/lldb/source/API/SBAttachInfo.cpp
+++ b/lldb/source/API/SBAttachInfo.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBAttachInfo.h"
-
+#include "Utils.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBListener.h"
#include "lldb/Target/Process.h"
@@ -39,7 +39,7 @@ SBAttachInfo::SBAttachInfo(const char *path, bool wait_for, bool async)
SBAttachInfo::SBAttachInfo(const SBAttachInfo &rhs)
: m_opaque_sp(new ProcessAttachInfo()) {
- *m_opaque_sp = *rhs.m_opaque_sp;
+ m_opaque_sp = clone(rhs.m_opaque_sp);
}
SBAttachInfo::~SBAttachInfo() {}
@@ -48,7 +48,7 @@ lldb_private::ProcessAttachInfo &SBAttachInfo::ref() { return *m_opaque_sp; }
SBAttachInfo &SBAttachInfo::operator=(const SBAttachInfo &rhs) {
if (this != &rhs)
- *m_opaque_sp = *rhs.m_opaque_sp;
+ m_opaque_sp = clone(rhs.m_opaque_sp);
return *this;
}
diff --git a/lldb/source/API/SBCommandReturnObject.cpp b/lldb/source/API/SBCommandReturnObject.cpp
index 4c28dc3d0ae..ef37e3d59b2 100644
--- a/lldb/source/API/SBCommandReturnObject.cpp
+++ b/lldb/source/API/SBCommandReturnObject.cpp
@@ -7,9 +7,9 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBCommandReturnObject.h"
+#include "Utils.h"
#include "lldb/API/SBError.h"
#include "lldb/API/SBStream.h"
-
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/Log.h"
@@ -23,8 +23,7 @@ SBCommandReturnObject::SBCommandReturnObject()
SBCommandReturnObject::SBCommandReturnObject(const SBCommandReturnObject &rhs)
: m_opaque_up() {
- if (rhs.m_opaque_up)
- m_opaque_up.reset(new CommandReturnObject(*rhs.m_opaque_up));
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBCommandReturnObject::SBCommandReturnObject(CommandReturnObject *ptr)
@@ -38,12 +37,8 @@ CommandReturnObject *SBCommandReturnObject::Release() {
const SBCommandReturnObject &SBCommandReturnObject::
operator=(const SBCommandReturnObject &rhs) {
- if (this != &rhs) {
- if (rhs.m_opaque_up)
- m_opaque_up.reset(new CommandReturnObject(*rhs.m_opaque_up));
- else
- m_opaque_up.reset();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBDeclaration.cpp b/lldb/source/API/SBDeclaration.cpp
index db1ec5e55f6..bec3791b506 100644
--- a/lldb/source/API/SBDeclaration.cpp
+++ b/lldb/source/API/SBDeclaration.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBDeclaration.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Host/PosixApi.h"
#include "lldb/Symbol/Declaration.h"
@@ -21,23 +22,18 @@ using namespace lldb_private;
SBDeclaration::SBDeclaration() : m_opaque_up() {}
SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_up() {
- if (rhs.IsValid())
- ref() = rhs.ref();
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr)
: m_opaque_up() {
if (lldb_object_ptr)
- ref() = *lldb_object_ptr;
+ m_opaque_up = llvm::make_unique<Declaration>(*lldb_object_ptr);
}
const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- ref() = rhs.ref();
- else
- m_opaque_up.reset();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBError.cpp b/lldb/source/API/SBError.cpp
index 2eca5463935..1b026f0c4b9 100644
--- a/lldb/source/API/SBError.cpp
+++ b/lldb/source/API/SBError.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBError.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/Status.h"
@@ -19,21 +20,14 @@ using namespace lldb_private;
SBError::SBError() : m_opaque_up() {}
SBError::SBError(const SBError &rhs) : m_opaque_up() {
- if (rhs.IsValid())
- m_opaque_up.reset(new Status(*rhs));
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBError::~SBError() {}
const SBError &SBError::operator=(const SBError &rhs) {
- if (rhs.IsValid()) {
- if (m_opaque_up)
- *m_opaque_up = *rhs;
- else
- m_opaque_up.reset(new Status(*rhs));
- } else
- m_opaque_up.reset();
-
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBExpressionOptions.cpp b/lldb/source/API/SBExpressionOptions.cpp
index 1b83713af5a..b12ddc42604 100644
--- a/lldb/source/API/SBExpressionOptions.cpp
+++ b/lldb/source/API/SBExpressionOptions.cpp
@@ -8,8 +8,8 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBExpressionOptions.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
-
#include "lldb/Target/Target.h"
using namespace lldb;
@@ -18,16 +18,15 @@ using namespace lldb_private;
SBExpressionOptions::SBExpressionOptions()
: m_opaque_up(new EvaluateExpressionOptions()) {}
-SBExpressionOptions::SBExpressionOptions(const SBExpressionOptions &rhs) {
- m_opaque_up.reset(new EvaluateExpressionOptions());
- *(m_opaque_up.get()) = rhs.ref();
+SBExpressionOptions::SBExpressionOptions(const SBExpressionOptions &rhs)
+ : m_opaque_up() {
+ m_opaque_up = clone(rhs.m_opaque_up);
}
const SBExpressionOptions &SBExpressionOptions::
operator=(const SBExpressionOptions &rhs) {
- if (this != &rhs) {
- this->ref() = rhs.ref();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBFileSpec.cpp b/lldb/source/API/SBFileSpec.cpp
index e606d6f7b62..92b48aa01c1 100644
--- a/lldb/source/API/SBFileSpec.cpp
+++ b/lldb/source/API/SBFileSpec.cpp
@@ -9,6 +9,7 @@
#include <inttypes.h>
#include <limits.h>
+#include "Utils.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBStream.h"
#include "lldb/Host/FileSystem.h"
@@ -24,8 +25,9 @@ using namespace lldb_private;
SBFileSpec::SBFileSpec() : m_opaque_up(new lldb_private::FileSpec()) {}
-SBFileSpec::SBFileSpec(const SBFileSpec &rhs)
- : m_opaque_up(new lldb_private::FileSpec(*rhs.m_opaque_up)) {}
+SBFileSpec::SBFileSpec(const SBFileSpec &rhs) : m_opaque_up() {
+ m_opaque_up = clone(rhs.m_opaque_up);
+}
SBFileSpec::SBFileSpec(const lldb_private::FileSpec &fspec)
: m_opaque_up(new lldb_private::FileSpec(fspec)) {}
@@ -45,7 +47,7 @@ SBFileSpec::~SBFileSpec() {}
const SBFileSpec &SBFileSpec::operator=(const SBFileSpec &rhs) {
if (this != &rhs)
- *m_opaque_up = *rhs.m_opaque_up;
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBFileSpecList.cpp b/lldb/source/API/SBFileSpecList.cpp
index 35304fe1747..d0b521c4b2f 100644
--- a/lldb/source/API/SBFileSpecList.cpp
+++ b/lldb/source/API/SBFileSpecList.cpp
@@ -8,6 +8,7 @@
#include <limits.h>
+#include "Utils.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBFileSpecList.h"
#include "lldb/API/SBStream.h"
@@ -25,8 +26,7 @@ SBFileSpecList::SBFileSpecList() : m_opaque_up(new FileSpecList()) {}
SBFileSpecList::SBFileSpecList(const SBFileSpecList &rhs) : m_opaque_up() {
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
- if (rhs.m_opaque_up)
- m_opaque_up.reset(new FileSpecList(*(rhs.get())));
+ m_opaque_up = clone(rhs.m_opaque_up);
if (log) {
log->Printf("SBFileSpecList::SBFileSpecList (const SBFileSpecList "
@@ -39,9 +39,8 @@ SBFileSpecList::SBFileSpecList(const SBFileSpecList &rhs) : m_opaque_up() {
SBFileSpecList::~SBFileSpecList() {}
const SBFileSpecList &SBFileSpecList::operator=(const SBFileSpecList &rhs) {
- if (this != &rhs) {
- m_opaque_up.reset(new lldb_private::FileSpecList(*(rhs.get())));
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBFrame.cpp b/lldb/source/API/SBFrame.cpp
index 5477a89c1b2..55401c03dff 100644
--- a/lldb/source/API/SBFrame.cpp
+++ b/lldb/source/API/SBFrame.cpp
@@ -15,6 +15,7 @@
#include "lldb/lldb-types.h"
#include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
+#include "Utils.h"
#include "lldb/Core/Address.h"
#include "lldb/Core/StreamFile.h"
#include "lldb/Core/ValueObjectRegister.h"
@@ -68,14 +69,15 @@ SBFrame::SBFrame(const StackFrameSP &lldb_object_sp)
}
}
-SBFrame::SBFrame(const SBFrame &rhs)
- : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {}
+SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() {
+ m_opaque_sp = clone(rhs.m_opaque_sp);
+}
SBFrame::~SBFrame() = default;
const SBFrame &SBFrame::operator=(const SBFrame &rhs) {
if (this != &rhs)
- *m_opaque_sp = *rhs.m_opaque_sp;
+ m_opaque_sp = clone(rhs.m_opaque_sp);
return *this;
}
diff --git a/lldb/source/API/SBLineEntry.cpp b/lldb/source/API/SBLineEntry.cpp
index 17cdf231600..2d3f23f454e 100644
--- a/lldb/source/API/SBLineEntry.cpp
+++ b/lldb/source/API/SBLineEntry.cpp
@@ -6,43 +6,39 @@
//
//===----------------------------------------------------------------------===//
-#include <limits.h>
-
#include "lldb/API/SBLineEntry.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Host/PosixApi.h"
#include "lldb/Symbol/LineEntry.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/StreamString.h"
+#include <limits.h>
+
using namespace lldb;
using namespace lldb_private;
SBLineEntry::SBLineEntry() : m_opaque_up() {}
SBLineEntry::SBLineEntry(const SBLineEntry &rhs) : m_opaque_up() {
- if (rhs.IsValid())
- ref() = rhs.ref();
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBLineEntry::SBLineEntry(const lldb_private::LineEntry *lldb_object_ptr)
: m_opaque_up() {
if (lldb_object_ptr)
- ref() = *lldb_object_ptr;
+ m_opaque_up = llvm::make_unique<LineEntry>(*lldb_object_ptr);
}
const SBLineEntry &SBLineEntry::operator=(const SBLineEntry &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- ref() = rhs.ref();
- else
- m_opaque_up.reset();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
void SBLineEntry::SetLineEntry(const lldb_private::LineEntry &lldb_object_ref) {
- ref() = lldb_object_ref;
+ m_opaque_up = llvm::make_unique<LineEntry>(lldb_object_ref);
}
SBLineEntry::~SBLineEntry() {}
diff --git a/lldb/source/API/SBMemoryRegionInfo.cpp b/lldb/source/API/SBMemoryRegionInfo.cpp
index 2a3f7c7c479..bbb2173badf 100644
--- a/lldb/source/API/SBMemoryRegionInfo.cpp
+++ b/lldb/source/API/SBMemoryRegionInfo.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBMemoryRegionInfo.h"
+#include "Utils.h"
#include "lldb/API/SBDefines.h"
#include "lldb/API/SBError.h"
#include "lldb/API/SBStream.h"
@@ -26,15 +27,14 @@ SBMemoryRegionInfo::SBMemoryRegionInfo(const MemoryRegionInfo *lldb_object_ptr)
}
SBMemoryRegionInfo::SBMemoryRegionInfo(const SBMemoryRegionInfo &rhs)
- : m_opaque_up(new MemoryRegionInfo()) {
- ref() = rhs.ref();
+ : m_opaque_up() {
+ m_opaque_up = clone(rhs.m_opaque_up);
}
const SBMemoryRegionInfo &SBMemoryRegionInfo::
operator=(const SBMemoryRegionInfo &rhs) {
- if (this != &rhs) {
- ref() = rhs.ref();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBModuleSpec.cpp b/lldb/source/API/SBModuleSpec.cpp
index a4d62665c36..fa34cff05c3 100644
--- a/lldb/source/API/SBModuleSpec.cpp
+++ b/lldb/source/API/SBModuleSpec.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBModuleSpec.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
@@ -19,12 +20,13 @@ using namespace lldb_private;
SBModuleSpec::SBModuleSpec() : m_opaque_up(new lldb_private::ModuleSpec()) {}
-SBModuleSpec::SBModuleSpec(const SBModuleSpec &rhs)
- : m_opaque_up(new lldb_private::ModuleSpec(*rhs.m_opaque_up)) {}
+SBModuleSpec::SBModuleSpec(const SBModuleSpec &rhs) : m_opaque_up() {
+ m_opaque_up = clone(rhs.m_opaque_up);
+}
const SBModuleSpec &SBModuleSpec::operator=(const SBModuleSpec &rhs) {
if (this != &rhs)
- *m_opaque_up = *(rhs.m_opaque_up);
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBProcessInfo.cpp b/lldb/source/API/SBProcessInfo.cpp
index 83f5eb1d680..6a3897bc72b 100644
--- a/lldb/source/API/SBProcessInfo.cpp
+++ b/lldb/source/API/SBProcessInfo.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBProcessInfo.h"
-
+#include "Utils.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/Utility/ProcessInfo.h"
@@ -17,20 +17,14 @@ using namespace lldb_private;
SBProcessInfo::SBProcessInfo() : m_opaque_up() {}
SBProcessInfo::SBProcessInfo(const SBProcessInfo &rhs) : m_opaque_up() {
- if (rhs.IsValid()) {
- ref() = *rhs.m_opaque_up;
- }
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBProcessInfo::~SBProcessInfo() {}
SBProcessInfo &SBProcessInfo::operator=(const SBProcessInfo &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- ref() = *rhs.m_opaque_up;
- else
- m_opaque_up.reset();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBStringList.cpp b/lldb/source/API/SBStringList.cpp
index 312a9dab959..12d35c9ecd2 100644
--- a/lldb/source/API/SBStringList.cpp
+++ b/lldb/source/API/SBStringList.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBStringList.h"
-
+#include "Utils.h"
#include "lldb/Utility/StringList.h"
using namespace lldb;
@@ -18,21 +18,16 @@ SBStringList::SBStringList() : m_opaque_up() {}
SBStringList::SBStringList(const lldb_private::StringList *lldb_strings_ptr)
: m_opaque_up() {
if (lldb_strings_ptr)
- m_opaque_up.reset(new lldb_private::StringList(*lldb_strings_ptr));
+ m_opaque_up = llvm::make_unique<StringList>(*lldb_strings_ptr);
}
SBStringList::SBStringList(const SBStringList &rhs) : m_opaque_up() {
- if (rhs.IsValid())
- m_opaque_up.reset(new lldb_private::StringList(*rhs));
+ m_opaque_up = clone(rhs.m_opaque_up);
}
const SBStringList &SBStringList::operator=(const SBStringList &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- m_opaque_up.reset(new lldb_private::StringList(*rhs));
- else
- m_opaque_up.reset();
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBSymbolContext.cpp b/lldb/source/API/SBSymbolContext.cpp
index 0260d1dc0db..ae426709f18 100644
--- a/lldb/source/API/SBSymbolContext.cpp
+++ b/lldb/source/API/SBSymbolContext.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBSymbolContext.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Core/Module.h"
#include "lldb/Symbol/Function.h"
@@ -21,38 +22,26 @@ SBSymbolContext::SBSymbolContext() : m_opaque_up() {}
SBSymbolContext::SBSymbolContext(const SymbolContext *sc_ptr) : m_opaque_up() {
if (sc_ptr)
- m_opaque_up.reset(new SymbolContext(*sc_ptr));
+ m_opaque_up = llvm::make_unique<SymbolContext>(*sc_ptr);
}
SBSymbolContext::SBSymbolContext(const SBSymbolContext &rhs) : m_opaque_up() {
- if (rhs.IsValid()) {
- if (m_opaque_up)
- *m_opaque_up = *rhs.m_opaque_up;
- else
- ref() = *rhs.m_opaque_up;
- }
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBSymbolContext::~SBSymbolContext() {}
const SBSymbolContext &SBSymbolContext::operator=(const SBSymbolContext &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- m_opaque_up.reset(new lldb_private::SymbolContext(*rhs.m_opaque_up));
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
void SBSymbolContext::SetSymbolContext(const SymbolContext *sc_ptr) {
- if (sc_ptr) {
- if (m_opaque_up)
- *m_opaque_up = *sc_ptr;
- else
- m_opaque_up.reset(new SymbolContext(*sc_ptr));
- } else {
- if (m_opaque_up)
- m_opaque_up->Clear(true);
- }
+ if (sc_ptr)
+ m_opaque_up = llvm::make_unique<SymbolContext>(*sc_ptr);
+ else
+ m_opaque_up->Clear(true);
}
bool SBSymbolContext::IsValid() const { return m_opaque_up != NULL; }
diff --git a/lldb/source/API/SBSymbolContextList.cpp b/lldb/source/API/SBSymbolContextList.cpp
index da344c4d585..7a5b93b4cda 100644
--- a/lldb/source/API/SBSymbolContextList.cpp
+++ b/lldb/source/API/SBSymbolContextList.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBSymbolContextList.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/Symbol/SymbolContext.h"
@@ -17,15 +18,17 @@ SBSymbolContextList::SBSymbolContextList()
: m_opaque_up(new SymbolContextList()) {}
SBSymbolContextList::SBSymbolContextList(const SBSymbolContextList &rhs)
- : m_opaque_up(new SymbolContextList(*rhs.m_opaque_up)) {}
+ : m_opaque_up() {
+
+ m_opaque_up = clone(rhs.m_opaque_up);
+}
SBSymbolContextList::~SBSymbolContextList() {}
const SBSymbolContextList &SBSymbolContextList::
operator=(const SBSymbolContextList &rhs) {
- if (this != &rhs) {
- *m_opaque_up = *rhs.m_opaque_up;
- }
+ if (this != &rhs)
+ m_opaque_up = clone(rhs.m_opaque_up);
return *this;
}
diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp
index 9d4cb156295..bc9652625ec 100644
--- a/lldb/source/API/SBThread.cpp
+++ b/lldb/source/API/SBThread.cpp
@@ -7,10 +7,18 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBThread.h"
-
+#include "Utils.h"
+#include "lldb/API/SBAddress.h"
+#include "lldb/API/SBDebugger.h"
+#include "lldb/API/SBEvent.h"
#include "lldb/API/SBFileSpec.h"
+#include "lldb/API/SBFrame.h"
+#include "lldb/API/SBProcess.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBSymbolContext.h"
+#include "lldb/API/SBThreadCollection.h"
+#include "lldb/API/SBThreadPlan.h"
+#include "lldb/API/SBValue.h"
#include "lldb/Breakpoint/BreakpointLocation.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/StreamFile.h"
@@ -33,15 +41,6 @@
#include "lldb/Utility/State.h"
#include "lldb/Utility/Stream.h"
#include "lldb/Utility/StructuredData.h"
-
-#include "lldb/API/SBAddress.h"
-#include "lldb/API/SBDebugger.h"
-#include "lldb/API/SBEvent.h"
-#include "lldb/API/SBFrame.h"
-#include "lldb/API/SBProcess.h"
-#include "lldb/API/SBThreadCollection.h"
-#include "lldb/API/SBThreadPlan.h"
-#include "lldb/API/SBValue.h"
#include "lldb/lldb-enumerations.h"
#include <memory>
@@ -61,8 +60,9 @@ SBThread::SBThread() : m_opaque_sp(new ExecutionContextRef()) {}
SBThread::SBThread(const ThreadSP &lldb_object_sp)
: m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {}
-SBThread::SBThread(const SBThread &rhs)
- : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {}
+SBThread::SBThread(const SBThread &rhs) : m_opaque_sp() {
+ m_opaque_sp = clone(rhs.m_opaque_sp);
+}
//----------------------------------------------------------------------
// Assignment operator
@@ -70,7 +70,7 @@ SBThread::SBThread(const SBThread &rhs)
const lldb::SBThread &SBThread::operator=(const SBThread &rhs) {
if (this != &rhs)
- *m_opaque_sp = *rhs.m_opaque_sp;
+ m_opaque_sp = clone(rhs.m_opaque_sp);
return *this;
}
diff --git a/lldb/source/API/SBTypeEnumMember.cpp b/lldb/source/API/SBTypeEnumMember.cpp
index 5ea28e40e67..62701ef1e4a 100644
--- a/lldb/source/API/SBTypeEnumMember.cpp
+++ b/lldb/source/API/SBTypeEnumMember.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBTypeEnumMember.h"
+#include "Utils.h"
#include "lldb/API/SBDefines.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBType.h"
@@ -22,23 +23,19 @@ using namespace lldb_private;
SBTypeEnumMember::SBTypeEnumMember() : m_opaque_sp() {}
SBTypeEnumMember::~SBTypeEnumMember() {}
+
SBTypeEnumMember::SBTypeEnumMember(
const lldb::TypeEnumMemberImplSP &enum_member_sp)
: m_opaque_sp(enum_member_sp) {}
SBTypeEnumMember::SBTypeEnumMember(const SBTypeEnumMember &rhs)
: m_opaque_sp() {
- if (this != &rhs) {
- if (rhs.IsValid())
- m_opaque_sp = std::make_shared<TypeEnumMemberImpl>(rhs.ref());
- }
+ m_opaque_sp = clone(rhs.m_opaque_sp);
}
SBTypeEnumMember &SBTypeEnumMember::operator=(const SBTypeEnumMember &rhs) {
- if (this != &rhs) {
- if (rhs.IsValid())
- m_opaque_sp = std::make_shared<TypeEnumMemberImpl>(rhs.ref());
- }
+ if (this != &rhs)
+ m_opaque_sp = clone(rhs.m_opaque_sp);
return *this;
}
diff --git a/lldb/source/API/SBTypeSummary.cpp b/lldb/source/API/SBTypeSummary.cpp
index 5c01522095f..349bfd06b9b 100644
--- a/lldb/source/API/SBTypeSummary.cpp
+++ b/lldb/source/API/SBTypeSummary.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/API/SBTypeSummary.h"
+#include "Utils.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBValue.h"
#include "lldb/DataFormatters/DataVisualization.h"
@@ -17,16 +18,12 @@
using namespace lldb;
using namespace lldb_private;
-SBTypeSummaryOptions::SBTypeSummaryOptions() {
- m_opaque_up.reset(new TypeSummaryOptions());
-}
+SBTypeSummaryOptions::SBTypeSummaryOptions()
+ : m_opaque_up(new TypeSummaryOptions()) {}
SBTypeSummaryOptions::SBTypeSummaryOptions(
const lldb::SBTypeSummaryOptions &rhs) {
- if (rhs.m_opaque_up)
- m_opaque_up.reset(new TypeSummaryOptions(*rhs.m_opaque_up));
- else
- m_opaque_up.reset(new TypeSummaryOptions());
+ m_opaque_up = clone(rhs.m_opaque_up);
}
SBTypeSummaryOptions::~SBTypeSummaryOptions() {}
diff --git a/lldb/source/API/Utils.h b/lldb/source/API/Utils.h
new file mode 100644
index 00000000000..b1975e5421d
--- /dev/null
+++ b/lldb/source/API/Utils.h
@@ -0,0 +1,30 @@
+//===-- Utils.h -------------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_API_UTILS_H
+#define LLDB_API_UTILS_H
+
+#include "llvm/ADT/STLExtras.h"
+#include <memory>
+
+namespace lldb_private {
+
+template <typename T> std::unique_ptr<T> clone(const std::unique_ptr<T> &src) {
+ if (src)
+ return llvm::make_unique<T>(*src);
+ return nullptr;
+}
+
+template <typename T> std::shared_ptr<T> clone(const std::shared_ptr<T> &src) {
+ if (src)
+ return std::make_shared<T>(*src);
+ return nullptr;
+}
+
+} // namespace lldb_private
+#endif
OpenPOWER on IntegriCloud