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
14*c6ad6901SVenkata Ramanaiah Nalamothu    # If your test case doesn't stress debug info, then
1599451b44SJordan Rupprecht    # set this to true.  That way it won't be run once for
1699451b44SJordan Rupprecht    # each debug info format.
1799451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht    def test_frame_var(self):
2099451b44SJordan Rupprecht        self.build()
2199451b44SJordan Rupprecht        self.do_test()
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht    def verify_point(self, frame, var_name, var_typename, x_value, y_value):
2499451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(var_name)
25779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find '%s'" % (var_name))
26b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetType().GetName(), var_typename,
2799451b44SJordan Rupprecht                        "Make sure '%s' has type '%s'" % (var_name, var_typename))
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        if '*' in var_typename:
3099451b44SJordan Rupprecht            valid_prefix = var_name + '->'
3199451b44SJordan Rupprecht            invalid_prefix = var_name + '.'
3299451b44SJordan Rupprecht        else:
3399451b44SJordan Rupprecht            valid_prefix = var_name + '.'
3499451b44SJordan Rupprecht            invalid_prefix = var_name + '->'
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        valid_x_path = valid_prefix + 'x'
3799451b44SJordan Rupprecht        valid_y_path = valid_prefix + 'y'
3899451b44SJordan Rupprecht        invalid_x_path = invalid_prefix + 'x'
3999451b44SJordan Rupprecht        invalid_y_path = invalid_prefix + 'y'
4099451b44SJordan Rupprecht        invalid_m_path = invalid_prefix + 'm'
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(valid_x_path)
43779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find '%s'" % (valid_x_path))
44b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetValue(), str(x_value), "Make sure '%s' has a value of %i" % (valid_x_path, x_value))
45b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetType().GetName(), "int", "Make sure '%s' has type 'int'" % (valid_x_path))
4699451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(invalid_x_path)
4799451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find '%s'" % (invalid_x_path))
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(valid_y_path)
50779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find '%s'" % (valid_y_path))
51b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetValue(), str(y_value), "Make sure '%s' has a value of %i" % (valid_y_path, y_value))
52b3a0c4d7SRaphael Isemann        self.assertEquals(v.GetType().GetName(), "int", "Make sure '%s' has type 'int'" % (valid_y_path))
5399451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(invalid_y_path)
5499451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find '%s'" % (invalid_y_path))
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        v = frame.GetValueForVariablePath(invalid_m_path)
5799451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find '%s'" % (invalid_m_path))
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht    def do_test(self):
6099451b44SJordan Rupprecht        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
6199451b44SJordan Rupprecht            self, "// Set a breakpoint here", lldb.SBFileSpec("main.cpp"))
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
6499451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('no_such_variable')
6599451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(), "Make sure we don't find 'no_such_variable'")
6699451b44SJordan Rupprecht
6799451b44SJordan Rupprecht        # Test an instance
6899451b44SJordan Rupprecht        self.verify_point(frame, 'pt', 'Point', 1, 2)
6999451b44SJordan Rupprecht        # Test a pointer
7099451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr', 'Point *', 3030, 4040)
7199451b44SJordan Rupprecht        # Test using a pointer as an array
7299451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr[-1]', 'Point', 1010, 2020)
7399451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr[0]', 'Point', 3030, 4040)
7499451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ptr[1]', 'Point', 5050, 6060)
7599451b44SJordan Rupprecht        # Test arrays
7699451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('points')
77779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find 'points'")
7899451b44SJordan Rupprecht        self.verify_point(frame, 'points[0]', 'Point', 1010, 2020)
7999451b44SJordan Rupprecht        self.verify_point(frame, 'points[1]', 'Point', 3030, 4040)
8099451b44SJordan Rupprecht        self.verify_point(frame, 'points[2]', 'Point', 5050, 6060)
81cf5ed6dcSJaroslav Sevcik        v = frame.GetValueForVariablePath('points[0]+5')
82cf5ed6dcSJaroslav Sevcik        self.assertTrue(v.GetError().Fail(),
83cf5ed6dcSJaroslav Sevcik                        "Make sure we do not ignore characters between ']' and the end")
8499451b44SJordan Rupprecht        # Test a reference
8599451b44SJordan Rupprecht        self.verify_point(frame, 'pt_ref', 'Point &', 1, 2)
8699451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('pt_sp')
87779bbbf2SDave Lee        self.assertSuccess(v.GetError(), "Make sure we find 'pt_sp'")
8899451b44SJordan Rupprecht        # Make sure we don't crash when looking for non existant child
8999451b44SJordan Rupprecht        # in type with synthetic children. This used to cause a crash.
9099451b44SJordan Rupprecht        v = frame.GetValueForVariablePath('pt_sp->not_valid_child')
9199451b44SJordan Rupprecht        self.assertTrue(v.GetError().Fail(),
9299451b44SJordan Rupprecht                        "Make sure we don't find 'pt_sp->not_valid_child'")
9399451b44SJordan Rupprecht
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht
96