| """ |
| Test the SBTarget API's to retrieve persistent types |
| and values. |
| """ |
| |
| |
| import lldb |
| import lldbsuite.test.lldbutil as lldbutil |
| from lldbsuite.test.lldbtest import * |
| |
| |
| class TestPersistentDecls(TestBase): |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| def test_persistent_types(self): |
| """Define some types in the expression evaluator and find them.""" |
| self.build() |
| self.main_source_file = lldb.SBFileSpec("main.c") |
| self.types_test() |
| |
| def test_persistent_values(self): |
| """Define some values in the expression evaluator and find them.""" |
| self.build() |
| self.main_source_file = lldb.SBFileSpec("main.c") |
| self.values_test() |
| |
| def types_test(self): |
| (target, _, _, _) = lldbutil.run_to_source_breakpoint( |
| self, "Set a breakpoint here", self.main_source_file |
| ) |
| |
| # Make some types so we aren't succeeding in gettting the only one. |
| |
| typename = "$firstStruct" |
| |
| self.expect(f"expr struct $SomeType {{ int b; int a; int c;}}") |
| self.expect(f"expr struct {typename} {{ int a; int b; char *c;}}") |
| self.expect(f"expr struct $AnotherType {{ int a; char *b; int c;}}") |
| self.expect(f"expr struct $YetAnotherType {{ char *a; int b; int c;}}") |
| |
| language = lldb.eLanguageTypeC_plus_plus |
| error = lldb.SBError() |
| type = target.FindExpressionTypeForLanguage(typename, language, error) |
| self.assertSuccess(error, "Got the right error") |
| self.assertTrue(type.IsValid(), "Got a valid type") |
| |
| # Make sure we got the type we expected: |
| self.assertEqual(type.name, typename, "Got the right type.") |
| # Now check that the fields are right: |
| self.assertEqual(type.num_fields, 3, "Right number of fields") |
| |
| ivar_a = type.fields[0] |
| self.assertEqual(ivar_a.name, "a", "a name is right") |
| self.assertEqual(ivar_a.type.name, "int", "Right type") |
| |
| ivar_b = type.fields[1] |
| self.assertEqual(ivar_b.name, "b", "b name is right") |
| self.assertEqual(ivar_b.type.name, "int", "Right type") |
| |
| ivar_c = type.fields[2] |
| self.assertEqual(ivar_c.name, "c", "c name is right") |
| self.assertEqual(ivar_c.type.name, "char *", "Right type") |
| |
| # Also test the error returns: |
| type = target.FindExpressionTypeForLanguage( |
| typename, lldb.eLanguageTypeUnknown, error |
| ) |
| self.assertFalse(error.Success(), "unknown doesn't support expression types") |
| self.assertFalse(type.IsValid(), "Type is also invalid.") |
| |
| type = target.FindExpressionTypeForLanguage("", language, error) |
| self.assertFalse(error.Success(), "empty type name for search.") |
| self.assertFalse(type.IsValid(), "Type is also invalid.") |
| type = target.FindExpressionTypeForLanguage( |
| "doesnt_start_with_dollar", language, error |
| ) |
| self.assertFalse(error.Success(), "Can't find names that don't exist.") |
| self.assertFalse(type.IsValid(), "Type is also invalid.") |
| |
| def values_test(self): |
| (target, _, _, _) = lldbutil.run_to_source_breakpoint( |
| self, "Set a breakpoint here", self.main_source_file |
| ) |
| |
| type_name = "struct $MyStruct" |
| value_name = "$my_struct" |
| self.expect("expr int $my_int = 100") |
| self.expect('expr char *$my_char_ptr = "Some char pointer."') |
| self.expect( |
| f"expr {type_name} {{int a; int b;}}; {type_name} {value_name} = {{10, 20}}" |
| ) |
| |
| # Now try to find one: |
| language = lldb.eLanguageTypeC_plus_plus |
| |
| value = target.FindExpressionVariableForLanguage(value_name, language) |
| |
| self.assertTrue(value.IsValid(), "Got a valid SBValue") |
| self.assertSuccess(value.GetError(), "Got no errors") |
| |
| value_checker = ValueCheck( |
| name=value_name, |
| type=type_name, |
| children=[ |
| ValueCheck(name="a", type="int", value="10"), |
| ValueCheck(name="b", type="int", value="20"), |
| ], |
| ) |
| value_checker.check_value(self, value, "Found the right value") |
| |
| # Also test that errors are set correctly: |
| value = target.FindExpressionVariableForLanguage( |
| value_name, lldb.eLanguageTypeUnknown |
| ) |
| self.assertFalse(value.error.Success(), "unknown can't compile expressions") |
| value = target.FindExpressionVariableForLanguage(None, language) |
| self.assertFalse(value.error.Success(), "reject empty expression variable name") |
| value = target.FindExpressionVariableForLanguage( |
| "doesnt_start_with_dollar", language |
| ) |
| self.assertFalse(value.error.Success(), "error on unknown variable name") |