| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class ChangePtrTest(TestBase): | |
| @skipIfWasm # the test checks the address of a persistent expression result | |
| def test(self): | |
| self.build() | |
| src_file = lldb.SBFileSpec("main.c") | |
| _, process, thread, _ = lldbutil.run_to_source_breakpoint( | |
| self, "// break here 1", src_file | |
| ) | |
| ## Test 1: The AddressOf of a dereferenced value should change when | |
| ## the pointer value is updated. | |
| frame = thread.GetFrameAtIndex(0) | |
| p = frame.FindVariable("p") | |
| deref = p.Dereference() | |
| self.assertEqual(deref.GetValueAsUnsigned(), 5) | |
| self.assertEqual(deref.AddressOf().GetValueAsUnsigned(), p.GetValueAsUnsigned()) | |
| thread.StepOver() | |
| self.assertEqual(deref.GetValueAsUnsigned(), 7) | |
| self.assertEqual(deref.AddressOf().GetValueAsUnsigned(), p.GetValueAsUnsigned()) | |
| ## Test 2: The AddressOf of a child value of a dereferenced value should | |
| ## change when the base pointer updates. | |
| lldbutil.continue_to_source_breakpoint( | |
| self, process, "// break here 2", src_file | |
| ) | |
| frame = thread.GetFrameAtIndex(0) | |
| p = frame.FindVariable("p") | |
| deref_child = p.Dereference().GetChildMemberWithName("b") | |
| self.assertEqual(deref_child.GetValue(), "'b'") | |
| self.assertEqual( | |
| deref_child.AddressOf().GetValueAsUnsigned(), p.GetValueAsUnsigned() + 1 | |
| ) | |
| thread.StepOver() | |
| self.assertEqual(deref_child.GetValue(), "'d'") | |
| self.assertEqual( | |
| deref_child.AddressOf().GetValueAsUnsigned(), p.GetValueAsUnsigned() + 1 | |
| ) | |
| ## Test 3: Verify AddressOf updates correctly with persistent expression results. | |
| lldbutil.continue_to_source_breakpoint( | |
| self, process, "// break here 3", src_file | |
| ) | |
| frame = thread.GetFrameAtIndex(0) | |
| frame.EvaluateExpression("int *$ptr = &a") | |
| ptr = frame.FindValue("$ptr", lldb.eValueTypeConstResult) | |
| deref = ptr.Dereference() | |
| self.assertEqual(deref.GetValueAsUnsigned(), 5) | |
| self.assertEqual( | |
| deref.AddressOf().GetValueAsUnsigned(), | |
| frame.FindVariable("a").AddressOf().GetValueAsUnsigned(), | |
| ) | |
| frame.EvaluateExpression("$ptr = &b") | |
| self.assertEqual(deref.GetValueAsUnsigned(), 7) | |
| self.assertEqual( | |
| deref.AddressOf().GetValueAsUnsigned(), | |
| frame.FindVariable("b").AddressOf().GetValueAsUnsigned(), | |
| ) |