Author: tkrasnukha Date: Sat Feb 16 10:39:14 2019 New Revision: 354206 URL: http://llvm.org/viewvc/llvm-project?rev=354206&view=rev Log: Add PythonBoolean type to the PythonDataObjects
Differential Revision: https://reviews.llvm.org/D57817 Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h lldb/trunk/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp?rev=354206&r1=354205&r2=354206&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp (original) +++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp Sat Feb 16 10:39:14 2019 @@ -77,6 +77,8 @@ PyObjectType PythonObject::GetObjectType #endif if (PythonByteArray::Check(m_py_obj)) return PyObjectType::ByteArray; + if (PythonBoolean::Check(m_py_obj)) + return PyObjectType::Boolean; if (PythonInteger::Check(m_py_obj)) return PyObjectType::Integer; if (PythonFile::Check(m_py_obj)) @@ -178,6 +180,9 @@ StructuredData::ObjectSP PythonObject::C case PyObjectType::Dictionary: return PythonDictionary(PyRefType::Borrowed, m_py_obj) .CreateStructuredDictionary(); + case PyObjectType::Boolean: + return PythonBoolean(PyRefType::Borrowed, m_py_obj) + .CreateStructuredBoolean(); case PyObjectType::Integer: return PythonInteger(PyRefType::Borrowed, m_py_obj) .CreateStructuredInteger(); @@ -525,6 +530,55 @@ StructuredData::IntegerSP PythonInteger: return result; } +//---------------------------------------------------------------------- +// PythonBoolean +//---------------------------------------------------------------------- + +PythonBoolean::PythonBoolean(PyRefType type, PyObject *py_obj) + : PythonObject() { + Reset(type, py_obj); // Use "Reset()" to ensure that py_obj is a boolean type +} + +PythonBoolean::PythonBoolean(const PythonBoolean &object) + : PythonObject(object) {} + +PythonBoolean::PythonBoolean(bool value) { + SetValue(value); +} + +bool PythonBoolean::Check(PyObject *py_obj) { + return py_obj ? PyBool_Check(py_obj) : false; +} + +void PythonBoolean::Reset(PyRefType type, PyObject *py_obj) { + // Grab the desired reference type so that if we end up rejecting `py_obj` it + // still gets decremented if necessary. + PythonObject result(type, py_obj); + + if (!PythonBoolean::Check(py_obj)) { + PythonObject::Reset(); + return; + } + + // Calling PythonObject::Reset(const PythonObject&) will lead to stack + // overflow since it calls back into the virtual implementation. + PythonObject::Reset(PyRefType::Borrowed, result.get()); +} + +bool PythonBoolean::GetValue() const { + return m_py_obj ? PyObject_IsTrue(m_py_obj) : false; +} + +void PythonBoolean::SetValue(bool value) { + PythonObject::Reset(PyRefType::Owned, PyBool_FromLong(value)); +} + +StructuredData::BooleanSP PythonBoolean::CreateStructuredBoolean() const { + StructuredData::BooleanSP result(new StructuredData::Boolean); + result->SetValue(GetValue()); + return result; +} + //---------------------------------------------------------------------- // PythonList //---------------------------------------------------------------------- Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h?rev=354206&r1=354205&r2=354206&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h (original) +++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h Sat Feb 16 10:39:14 2019 @@ -57,6 +57,7 @@ private: enum class PyObjectType { Unknown, None, + Boolean, Integer, Dictionary, List, @@ -297,6 +298,29 @@ public: StructuredData::IntegerSP CreateStructuredInteger() const; }; +class PythonBoolean : public PythonObject { +public: + PythonBoolean() = default; + explicit PythonBoolean(bool value); + PythonBoolean(PyRefType type, PyObject *o); + PythonBoolean(const PythonBoolean &object); + + ~PythonBoolean() override = default; + + static bool Check(PyObject *py_obj); + + // Bring in the no-argument base class version + using PythonObject::Reset; + + void Reset(PyRefType type, PyObject *py_obj) override; + + bool GetValue() const; + + void SetValue(bool value); + + StructuredData::BooleanSP CreateStructuredBoolean() const; +}; + class PythonList : public PythonObject { public: PythonList() {} Modified: lldb/trunk/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp?rev=354206&r1=354205&r2=354206&view=diff ============================================================================== --- lldb/trunk/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp (original) +++ lldb/trunk/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp Sat Feb 16 10:39:14 2019 @@ -195,6 +195,31 @@ TEST_F(PythonDataObjectsTest, TestPython EXPECT_EQ(7, constructed_int.GetInteger()); } +TEST_F(PythonDataObjectsTest, TestPythonBoolean) { + // Test PythonBoolean constructed from Py_True + EXPECT_TRUE(PythonBoolean::Check(Py_True)); + PythonBoolean python_true(PyRefType::Owned, Py_True); + EXPECT_EQ(PyObjectType::Boolean, python_true.GetObjectType()); + + // Test PythonBoolean constructed from Py_False + EXPECT_TRUE(PythonBoolean::Check(Py_False)); + PythonBoolean python_false(PyRefType::Owned, Py_False); + EXPECT_EQ(PyObjectType::Boolean, python_false.GetObjectType()); + + auto test_from_long = [](long value) { + PyObject *py_bool = PyBool_FromLong(value); + EXPECT_TRUE(PythonBoolean::Check(py_bool)); + PythonBoolean python_boolean(PyRefType::Owned, py_bool); + EXPECT_EQ(PyObjectType::Boolean, python_boolean.GetObjectType()); + EXPECT_EQ(bool(value), python_boolean.GetValue()); + }; + + // Test PythonBoolean constructed from long integer values. + test_from_long(0); // Test 'false' value. + test_from_long(1); // Test 'true' value. + test_from_long(~0); // Any value != 0 is 'true'. +} + TEST_F(PythonDataObjectsTest, TestPythonBytes) { static const char *test_bytes = "PythonDataObjectsTest::TestPythonBytes"; PyObject *py_bytes = PyBytes_FromString(test_bytes); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits