Author: zturner Date: Thu Nov 12 19:50:19 2015 New Revision: 253002 URL: http://llvm.org/viewvc/llvm-project?rev=253002&view=rev Log: Fix a bug in PythonExceptionState and add unittest coverage.
I forgot to reset the restore flag when calling member function `Acquire`. The newly added unittest should cover this case. Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.cpp lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.h lldb/trunk/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.cpp?rev=253002&r1=253001&r2=253002&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.cpp (original) +++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.cpp Thu Nov 12 19:50:19 2015 @@ -50,6 +50,7 @@ PythonExceptionState::Acquire(bool resto m_type.Reset(PyRefType::Owned, py_type); m_value.Reset(PyRefType::Owned, py_value); m_traceback.Reset(PyRefType::Owned, py_traceback); + m_restore_on_exit = restore_on_exit; } void @@ -77,6 +78,15 @@ PythonExceptionState::Discard() m_traceback.Reset(); } +void +PythonExceptionState::Reset() +{ + if (m_restore_on_exit) + Restore(); + else + Discard(); +} + bool PythonExceptionState::HasErrorOccurred() { Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.h?rev=253002&r1=253001&r2=253002&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.h (original) +++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/PythonExceptionState.h Thu Nov 12 19:50:19 2015 @@ -30,6 +30,9 @@ class PythonExceptionState void Discard(); + void + Reset(); + static bool HasErrorOccurred(); Modified: lldb/trunk/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp?rev=253002&r1=253001&r2=253002&view=diff ============================================================================== --- lldb/trunk/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp (original) +++ lldb/trunk/unittests/ScriptInterpreter/Python/PythonExceptionStateTests.cpp Thu Nov 12 19:50:19 2015 @@ -79,6 +79,33 @@ TEST_F(PythonExceptionStateTest, TestDis EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); } +TEST_F(PythonExceptionStateTest, TestResetSemantics) +{ + PyErr_Clear(); + + // Resetting when auto-restore is true should restore. + RaiseException(); + PythonExceptionState error(true); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + error.Reset(); + EXPECT_FALSE(error.IsError()); + EXPECT_TRUE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); + + // Resetting when auto-restore is false should discard. + RaiseException(); + PythonExceptionState error2(false); + EXPECT_TRUE(error2.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + error2.Reset(); + EXPECT_FALSE(error2.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); +} + TEST_F(PythonExceptionStateTest, TestManualRestoreSemantics) { PyErr_Clear(); @@ -119,3 +146,29 @@ TEST_F(PythonExceptionStateTest, TestAut PyErr_Clear(); } + +TEST_F(PythonExceptionStateTest, TestAutoRestoreChanged) +{ + // Test that if we re-acquire with different auto-restore semantics, + // that the new semantics are respected. + PyErr_Clear(); + + RaiseException(); + PythonExceptionState error(false); + EXPECT_TRUE(error.IsError()); + + error.Reset(); + EXPECT_FALSE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + RaiseException(); + error.Acquire(true); + EXPECT_TRUE(error.IsError()); + EXPECT_FALSE(PythonExceptionState::HasErrorOccurred()); + + error.Reset(); + EXPECT_FALSE(error.IsError()); + EXPECT_TRUE(PythonExceptionState::HasErrorOccurred()); + + PyErr_Clear(); +} \ No newline at end of file _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits