199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtMake sure the getting a variable path works and doesn't crash.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass TestVarPath(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    # If your test case doesn't stress debug info, the
1799451b44SJordan Rupprecht    # set this to true.  That way it won't be run once for
1899451b44SJordan Rupprecht    # each debug info format.
1999451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht    def test_frame_var(self):
2299451b44SJordan Rupprecht        self.build()
2399451b44SJordan Rupprecht        self.do_test()
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht    def verify_point(self, frame, var_name, var_typename, x_value, y_value):
2699451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(var_name)
27*779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find '%s'" % (var_name))
28b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetType().GetName(), var_typename,
2999451b44SJordan Rupprecht                        "Make sure '%s' has type '%s'" % (var_name, var_typename))
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        if '*' in var_typename:
3299451b44SJordan Rupprecht            valid_prefix = var_name + '->'
3399451b44SJordan Rupprecht            invalid_prefix = var_name + '.'
3499451b44SJordan Rupprecht        else:
3599451b44SJordan Rupprecht            valid_prefix = var_name + '.'
3699451b44SJordan Rupprecht            invalid_prefix = var_name + '->'
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        valid_x_path = valid_prefix + 'x'
3999451b44SJordan Rupprecht        valid_y_path = valid_prefix + 'y'
4099451b44SJordan Rupprecht        invalid_x_path = invalid_prefix + 'x'
4199451b44SJordan Rupprecht        invalid_y_path = invalid_prefix + 'y'
4299451b44SJordan Rupprecht        invalid_m_path = invalid_prefix + 'm'
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(valid_x_path)
45*779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find '%s'" % (valid_x_path))
46b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetValue(), str(x_value), "Make sure '%s' has a value of %i" % (valid_x_path, x_value))
47b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetType().GetName(), "int", "Make sure '%s' has type 'int'" % (valid_x_path))
4899451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(invalid_x_path)
4999451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find '%s'" % (invalid_x_path))
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(valid_y_path)
52*779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find '%s'" % (valid_y_path))
53b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetValue(), str(y_value), "Make sure '%s' has a value of %i" % (valid_y_path, y_value))
54b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetType().GetName(), "int", "Make sure '%s' has type 'int'" % (valid_y_path))
5599451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(invalid_y_path)
5699451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find '%s'" % (invalid_y_path))
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(invalid_m_path)
5999451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find '%s'" % (invalid_m_path))
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht    def do_test(self):
6299451b44SJordan Rupprecht        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
6399451b44SJordan Rupprecht            self, "// Set a breakpoint here", lldb.SBFileSpec("main.cpp"))
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
6699451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('no_such_variable')
6799451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find 'no_such_variable'")
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        # Test an instance
7099451b44SJordan Rupprecht        self.verify_point(frame, 'pt', 'Point', 1, 2)
7199451b44SJordan Rupprecht        # Test a pointer
7299451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr', 'Point *', 3030, 4040)
7399451b44SJordan Rupprecht        # Test using a pointer as an array
7499451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr[-1]', 'Point', 1010, 2020)
7599451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr[0]', 'Point', 3030, 4040)
7699451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr[1]', 'Point', 5050, 6060)
7799451b44SJordan Rupprecht        # Test arrays
7899451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('points')
79*779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find 'points'")
8099451b44SJordan Rupprecht        self.verify_point(frame, 'points[0]', 'Point', 1010, 2020)
8199451b44SJordan Rupprecht        self.verify_point(frame, 'points[1]', 'Point', 3030, 4040)
8299451b44SJordan Rupprecht        self.verify_point(frame, 'points[2]', 'Point', 5050, 6060)
83cf5ed6dcSJaroslav Sevcik        v = frame.GetValueForVariablePath('points[0]+5')
84cf5ed6dcSJaroslav Sevcik        self.assertTrue(v.GetError().Fail(),
85cf5ed6dcSJaroslav Sevcik                        "Make sure we do not ignore characters between ']' and the end")
8699451b44SJordan Rupprecht        # Test a reference
8799451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ref', 'Point &', 1, 2)
8899451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('pt_sp')
89*779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find 'pt_sp'")
9099451b44SJordan Rupprecht        # Make sure we don't crash when looking for non existant child
9199451b44SJordan Rupprecht        # in type with synthetic children. This used to cause a crash.
9299451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('pt_sp->not_valid_child')
9399451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(),
9499451b44SJordan Rupprecht                        "Make sure we don't find 'pt_sp->not_valid_child'")
9599451b44SJordan Rupprecht
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht
98