summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/commands/expression/context-object
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/commands/expression/context-object')
-rw-r--r--lldb/packages/Python/lldbsuite/test/commands/expression/context-object/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/commands/expression/context-object/TestContextObject.py145
-rw-r--r--lldb/packages/Python/lldbsuite/test/commands/expression/context-object/main.cpp46
3 files changed, 196 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/Makefile b/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/Makefile
new file mode 100644
index 00000000000..8a7102e347a
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/TestContextObject.py b/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/TestContextObject.py
new file mode 100644
index 00000000000..02b8162aad6
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/TestContextObject.py
@@ -0,0 +1,145 @@
+"""
+Tests expression evaluation in context of an object.
+"""
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class ContextObjectTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_context_object(self):
+ """Tests expression evaluation in context of an object."""
+ self.build()
+
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, '// Break here', self.main_source_spec)
+ frame = thread.GetFrameAtIndex(0)
+
+ #
+ # Test C++ struct variable
+ #
+
+ obj_val = frame.FindVariable("cpp_struct")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test an empty expression evaluation
+ value = obj_val.EvaluateExpression("")
+ self.assertFalse(value.IsValid())
+ self.assertFalse(value.GetError().Success())
+
+ # Test retrieveing of a field (not a local with the same name)
+ value = obj_val.EvaluateExpression("field")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 1111)
+
+ # Test functions evaluation
+ value = obj_val.EvaluateExpression("function()")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 2222)
+
+ # Test that we retrieve the right global
+ value = obj_val.EvaluateExpression("global.field")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 1111)
+
+ #
+ # Test C++ union variable
+ #
+
+ obj_val = frame.FindVariable("cpp_union")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test retrieveing of a field
+ value = obj_val.EvaluateExpression("field_int")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 5555)
+
+ #
+ # Test C++ scalar
+ #
+
+ obj_val = frame.FindVariable("cpp_scalar")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test an expression evaluation
+ value = obj_val.EvaluateExpression("1")
+ self.assertFalse(value.IsValid())
+ self.assertFalse(value.GetError().Success())
+
+ #
+ # Test C++ array
+ #
+
+ obj_val = frame.FindVariable("cpp_array")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test an expression evaluation
+ value = obj_val.EvaluateExpression("1")
+ self.assertFalse(value.IsValid())
+ self.assertFalse(value.GetError().Success())
+
+ # Test retrieveing of an element's field
+ value = obj_val.GetValueForExpressionPath("[7]").EvaluateExpression("field")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 1111)
+
+ #
+ # Test C++ pointer
+ #
+
+ obj_val = frame.FindVariable("cpp_pointer")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test an expression evaluation
+ value = obj_val.EvaluateExpression("1")
+ self.assertFalse(value.IsValid())
+ self.assertFalse(value.GetError().Success())
+
+ # Test retrieveing of a dereferenced object's field
+ value = obj_val.Dereference().EvaluateExpression("field")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 1111)
+
+ #
+ # Test C++ computation result
+ #
+
+ obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStruct()")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test an expression evaluation
+ value = obj_val.EvaluateExpression("1")
+ self.assertTrue(value.IsValid())
+ self.assertFalse(value.GetError().Success())
+
+ #
+ # Test C++ computation result located in debuggee memory
+ #
+
+ obj_val = frame.EvaluateExpression("cpp_namespace::GetCppStructPtr()")
+ self.assertTrue(obj_val.IsValid())
+
+ # Test an expression evaluation
+ value = obj_val.EvaluateExpression("1")
+ self.assertFalse(value.IsValid())
+ self.assertFalse(value.GetError().Success())
+
+ # Test retrieveing of a dereferenced object's field
+ value = obj_val.Dereference().EvaluateExpression("field")
+ self.assertTrue(value.IsValid())
+ self.assertTrue(value.GetError().Success())
+ self.assertEqual(value.GetValueAsSigned(), 1111)
+
+ def setUp(self):
+ TestBase.setUp(self)
+
+ self.main_source = "main.cpp"
+ self.main_source_spec = lldb.SBFileSpec(self.main_source)
diff --git a/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/main.cpp b/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/main.cpp
new file mode 100644
index 00000000000..098b6089fce
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/commands/expression/context-object/main.cpp
@@ -0,0 +1,46 @@
+namespace cpp_namespace {
+ struct CppStruct {
+ int field = 1111;
+
+ int function() {
+ return 2222;
+ }
+ };
+
+ union CppUnion {
+ char field_char;
+ short field_short;
+ int field_int;
+ };
+
+ CppStruct GetCppStruct() {
+ return CppStruct();
+ }
+
+ CppStruct global;
+
+ CppStruct *GetCppStructPtr() {
+ return &global;
+ }
+}
+
+int global = 3333;
+
+int main()
+{
+ cpp_namespace::CppStruct cpp_struct = cpp_namespace::GetCppStruct();
+ cpp_struct.function();
+
+ int field = 4444;
+
+ cpp_namespace::CppUnion cpp_union;
+ cpp_union.field_int = 5555;
+
+ int cpp_scalar = 6666;
+
+ cpp_namespace::CppStruct cpp_array[16];
+
+ cpp_namespace::CppStruct *cpp_pointer = cpp_namespace::GetCppStructPtr();
+
+ return 0; // Break here
+}
OpenPOWER on IntegriCloud