13990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata""" 23990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico GranataTest lldb data formatter subsystem. 33990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata""" 43990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 53990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport os, time 63990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport unittest2 73990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport lldb 83990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granatafrom lldbtest import * 93990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport lldbutil 103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataclass LibcxxMultiMapDataFormatterTestCase(TestBase): 123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata mydir = os.path.join("functionalities", "data-formatter", "data-formatter-stl", "libcxx", "multimap") 143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata @dsym_test 173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata def test_with_dsym_and_run_command(self): 183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata """Test data formatter commands.""" 193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.buildDsym() 203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.data_formatter_commands() 213990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 223990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata @skipIfLinux # No standard locations for libc++ on Linux, so skip for now 233990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata @dwarf_test 243990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata def test_with_dwarf_and_run_command(self): 253990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata """Test data formatter commands.""" 263990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.buildDwarf() 273990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.data_formatter_commands() 283990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 293990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata def setUp(self): 303990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # Call super's setUp(). 313990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata TestBase.setUp(self) 323990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 333990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata def data_formatter_commands(self): 343990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata """Test that that file and class static variables display correctly.""" 353990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) 363990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 373990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata lldbutil.run_break_set_by_source_regexp (self, "Set break point at this line.") 383990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 393990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("run", RUN_SUCCEEDED) 403990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 413990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # The stop reason of the thread should be breakpoint. 423990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 433990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['stopped', 443990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'stop reason = breakpoint']) 453990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 463990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # This is the function to remove the custom formats in order to have a 473990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # clean slate for the next test case. 483990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata def cleanup(): 493990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd('type format clear', check=False) 503990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd('type summary clear', check=False) 513990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd('type filter clear', check=False) 523990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd('type synth clear', check=False) 533990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("settings set target.max-children-count 256", check=False) 543990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 553990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # Execute the cleanup function during test case tear down. 563990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.addTearDownHook(cleanup) 573990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 583990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('image list',substrs=['libc++.1.dylib','libc++abi.dylib']) 593990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 603990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("frame variable ii --show-types") 613990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 623990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable ii', 633990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 643990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 653990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 663990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 673990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 683990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable ii', 693990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=2', 703990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = {', 713990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 0', 723990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0', 733990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = {', 743990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 1', 753990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1']) 763990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 773990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 783990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 793990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable ii', 803990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=4', 813990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = {', 823990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 2', 833990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0', 843990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[3] = {', 853990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 3', 863990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1']) 873990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 883990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 893990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 903990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable ii", 913990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=8', 923990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[5] = {', 933990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 5', 943990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0', 953990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[7] = {', 963990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 7', 973990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1']) 983990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 993990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("p ii", 1003990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=8', 1013990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[5] = {', 1023990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 5', 1033990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0', 1043990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[7] = {', 1053990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 7', 1063990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1']) 1073990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1083990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check access-by-index 1093990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable ii[0]", 1103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['first = 0', 1113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0']); 1123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable ii[3]", 1133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['first =', 1143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second =']); 1153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that MightHaveChildren() gets it right 1173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.assertTrue(self.frame().FindVariable("ii").MightHaveChildren(), "ii.MightHaveChildren() says False for non empty!") 1183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that the expression parser does not make use of 1203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # synthetic children instead of running code 1213990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # TOT clang has a fix for this, which makes the expression command here succeed 1223990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # since this would make the test fail or succeed depending on clang version in use 1233990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # this is safer commented for the time being 1243990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata #self.expect("expression ii[8]", matching=False, error=True, 1253990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # substrs = ['1234567']) 1263990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1273990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 1283990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1293990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable ii', 1303990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 1313990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 1323990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1333990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("frame variable si --show-types") 1343990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1353990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable si', 1363990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 1373990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 1383990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1393990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 1403990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1413990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable si', 1423990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=1', 1433990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 1443990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"zero\"', 1453990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0']) 1463990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1473990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 1483990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1493990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable si", 1503990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=4', 1513990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 1523990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"zero\"', 1533990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0', 1543990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = ', 1553990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"one\"', 1563990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1', 1573990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = ', 1583990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"two\"', 1593990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 2', 1603990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[3] = ', 1613990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"three\"', 1623990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 3']) 1633990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1643990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("p si", 1653990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=4', 1663990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 1673990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"zero\"', 1683990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 0', 1693990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = ', 1703990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"one\"', 1713990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1', 1723990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = ', 1733990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"two\"', 1743990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 2', 1753990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[3] = ', 1763990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"three\"', 1773990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 3']) 1783990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1793990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that MightHaveChildren() gets it right 1803990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.assertTrue(self.frame().FindVariable("si").MightHaveChildren(), "si.MightHaveChildren() says False for non empty!") 1813990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1823990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check access-by-index 1833990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable si[0]", 1843990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['first = ', 'one', 1853990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = 1']); 1863990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1873990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that the expression parser does not make use of 1883990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # synthetic children instead of running code 1893990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # TOT clang has a fix for this, which makes the expression command here succeed 1903990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # since this would make the test fail or succeed depending on clang version in use 1913990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # this is safer commented for the time being 1923990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata #self.expect("expression si[0]", matching=False, error=True, 1933990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # substrs = ['first = ', 'zero']) 1943990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1953990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 1963990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 1973990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable si', 1983990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 1993990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 2003990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2013990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 2023990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("frame variable is --show-types") 2033990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2043990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable is', 2053990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 2063990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 2073990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2083990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 2093990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable is", 2113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=4', 2123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 2133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"goofy\"', 2143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 85', 2153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = ', 2163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"is\"', 2173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 1', 2183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = ', 2193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"smart\"', 2203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 2', 2213990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[3] = ', 2223990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"!!!\"', 2233990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 3']) 2243990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2253990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("p is", 2263990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=4', 2273990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 2283990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"goofy\"', 2293990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 85', 2303990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = ', 2313990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"is\"', 2323990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 1', 2333990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = ', 2343990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"smart\"', 2353990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 2', 2363990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[3] = ', 2373990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"!!!\"', 2383990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = 3']) 2393990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2403990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that MightHaveChildren() gets it right 2413990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.assertTrue(self.frame().FindVariable("is").MightHaveChildren(), "is.MightHaveChildren() says False for non empty!") 2423990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2433990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check access-by-index 2443990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable is[0]", 2453990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['first = ', 2463990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second =']); 2473990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2483990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that the expression parser does not make use of 2493990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # synthetic children instead of running code 2503990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # TOT clang has a fix for this, which makes the expression command here succeed 2513990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # since this would make the test fail or succeed depending on clang version in use 2523990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # this is safer commented for the time being 2533990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata #self.expect("expression is[0]", matching=False, error=True, 2543990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # substrs = ['first = ', 'goofy']) 2553990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2563990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 2573990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2583990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable is', 2593990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 2603990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 2613990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2623990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 2633990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("frame variable ss --show-types") 2643990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2653990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable ss', 2663990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 2673990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 2683990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2693990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 2703990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2713990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable ss", 2723990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=3', 2733990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 2743990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"hello\"', 2753990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"ciao\"', 2763990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = ', 2773990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"house\"', 2783990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"casa\"', 2793990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = ', 2803990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"cat\"', 2813990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"gatto\"']) 2823990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2833990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("p ss", 2843990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=3', 2853990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[0] = ', 2863990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"hello\"', 2873990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"ciao\"', 2883990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[1] = ', 2893990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"house\"', 2903990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"casa\"', 2913990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '[2] = ', 2923990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'second = \"cat\"', 2933990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 'first = \"gatto\"']) 2943990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2953990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that MightHaveChildren() gets it right 2963990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.assertTrue(self.frame().FindVariable("ss").MightHaveChildren(), "ss.MightHaveChildren() says False for non empty!") 2973990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 2983990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check access-by-index 2993990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect("frame variable ss[2]", 3003990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['gatto', 'cat']); 3013990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 3023990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # check that the expression parser does not make use of 3033990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # synthetic children instead of running code 3043990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # TOT clang has a fix for this, which makes the expression command here succeed 3053990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # since this would make the test fail or succeed depending on clang version in use 3063990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # this is safer commented for the time being 3073990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata #self.expect("expression ss[3]", matching=False, error=True, 3083990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata # substrs = ['gatto']) 3093990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 3103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.runCmd("continue"); 3113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 3123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata self.expect('frame variable ss', 3133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata substrs = ['size=0', 3143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata '{}']) 3153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata 3163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataif __name__ == '__main__': 3173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata import atexit 3183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata lldb.SBDebugger.Initialize() 3193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata atexit.register(lambda: lldb.SBDebugger.Terminate()) 3203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata unittest2.main() 321