summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLawrence D'Anna <lawrence_danna@apple.com>2019-10-17 22:22:09 +0000
committerLawrence D'Anna <lawrence_danna@apple.com>2019-10-17 22:22:09 +0000
commit634ed7b0d59911b4f31a5bed78fb195d722ac208 (patch)
tree4b9d14a7d4e6148d3eec57368e5785dc8d3f7c08
parent04e0d2e8ddce6bc4309b559dd99c365bb27271b9 (diff)
eliminate one form of PythonObject::Reset()
Summary: I'd like to eliminate all forms of Reset() and all public constructors on these objects, so the only way to make them is with Take<> and Retain<> and the only way to copy or move them is with actual c++ copy, move, or assignment. This is a simple place to start. Reviewers: JDevlieghere, clayborg, labath, jingham Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D69080 git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@375182 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp2
-rw-r--r--source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h30
-rw-r--r--unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp20
3 files changed, 15 insertions, 37 deletions
diff --git a/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
index 3ac404b53..1fb9355b9 100644
--- a/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
+++ b/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
@@ -410,7 +410,7 @@ void PythonString::SetString(llvm::StringRef string) {
llvm::consumeError(s.takeError());
Reset();
} else {
- PythonObject::Reset(std::move(s.get()));
+ *this = std::move(s.get());
}
}
diff --git a/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h b/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
index 7f460234f..5823f740a 100644
--- a/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
+++ b/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
@@ -182,7 +182,8 @@ public:
Reset(type, py_obj);
}
- PythonObject(const PythonObject &rhs) : m_py_obj(nullptr) { Reset(rhs); }
+ PythonObject(const PythonObject &rhs)
+ : PythonObject(PyRefType::Borrowed, rhs.m_py_obj) {}
PythonObject(PythonObject &&rhs) {
m_py_obj = rhs.m_py_obj;
@@ -197,19 +198,6 @@ public:
m_py_obj = nullptr;
}
- void Reset(const PythonObject &rhs) {
- if (!rhs.IsValid())
- Reset();
- else
- Reset(PyRefType::Borrowed, rhs.m_py_obj);
- }
-
- // PythonObject is implicitly convertible to PyObject *, which will call the
- // wrong overload. We want to explicitly disallow this, since a PyObject
- // *always* owns its reference. Therefore the overload which takes a
- // PyRefType doesn't make sense, and the copy constructor should be used.
- void Reset(PyRefType type, const PythonObject &ref) = delete;
-
void Reset(PyRefType type, PyObject *py_obj) {
if (py_obj == m_py_obj)
return;
@@ -244,19 +232,9 @@ public:
return result;
}
- PythonObject &operator=(const PythonObject &other) {
- Reset(PyRefType::Borrowed, other.get());
- return *this;
- }
-
- void Reset(PythonObject &&other) {
+ PythonObject &operator=(PythonObject other) {
Reset();
- m_py_obj = other.m_py_obj;
- other.m_py_obj = nullptr;
- }
-
- PythonObject &operator=(PythonObject &&other) {
- Reset(std::move(other));
+ m_py_obj = std::exchange(other.m_py_obj, nullptr);
return *this;
}
diff --git a/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp b/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
index 3f0cb78b6..d9e4435bf 100644
--- a/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
+++ b/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
@@ -323,8 +323,8 @@ TEST_F(PythonDataObjectsTest, TestPythonListValueEquality) {
PythonList list(PyRefType::Owned, py_list);
PythonObject list_items[list_size];
- list_items[0].Reset(PythonInteger(long_value0));
- list_items[1].Reset(PythonString(string_value1));
+ list_items[0] = PythonInteger(long_value0);
+ list_items[1] = PythonString(string_value1);
for (unsigned i = 0; i < list_size; ++i)
list.SetItemAtIndex(i, list_items[i]);
@@ -469,10 +469,10 @@ TEST_F(PythonDataObjectsTest, TestPythonDictionaryValueEquality) {
PythonObject py_keys[dict_entries];
PythonObject py_values[dict_entries];
- py_keys[0].Reset(PythonString(key_0));
- py_keys[1].Reset(PythonInteger(key_1));
- py_values[0].Reset(PythonInteger(value_0));
- py_values[1].Reset(PythonString(value_1));
+ py_keys[0] = PythonString(key_0);
+ py_keys[1] = PythonInteger(key_1);
+ py_values[0] = PythonInteger(value_0);
+ py_values[1] = PythonString(value_1);
PyObject *py_dict = PyDict_New();
EXPECT_TRUE(PythonDictionary::Check(py_dict));
@@ -509,10 +509,10 @@ TEST_F(PythonDataObjectsTest, TestPythonDictionaryManipulation) {
PythonString keys[dict_entries];
PythonObject values[dict_entries];
- keys[0].Reset(PythonString(key_0));
- keys[1].Reset(PythonString(key_1));
- values[0].Reset(PythonInteger(value_0));
- values[1].Reset(PythonString(value_1));
+ keys[0] = PythonString(key_0);
+ keys[1] = PythonString(key_1);
+ values[0] = PythonInteger(value_0);
+ values[1] = PythonString(value_1);
PythonDictionary dict(PyInitialValue::Empty);
for (int i = 0; i < 2; ++i)