199451b44SJordan Rupprecht"""Test the SBData APIs."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom math import fabs
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass SBDataAPICase(TestBase):
1399451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def setUp(self):
1699451b44SJordan Rupprecht        # Call super's setUp().
1799451b44SJordan Rupprecht        TestBase.setUp(self)
1899451b44SJordan Rupprecht        # Find the line number to break on inside main.cpp.
1999451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// set breakpoint here')
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht    def test_byte_order_and_address_byte_size(self):
2299451b44SJordan Rupprecht        """Test the SBData::SetData() to ensure the byte order and address
2399451b44SJordan Rupprecht        byte size are obeyed"""
2499451b44SJordan Rupprecht        addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88'
2599451b44SJordan Rupprecht        error = lldb.SBError()
2699451b44SJordan Rupprecht        data = lldb.SBData()
2799451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 4)
2899451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
29619e2e09SDave Lee        self.assertEqual(addr, 0x11223344);
3099451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderBig, 8)
3199451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
32619e2e09SDave Lee        self.assertEqual(addr, 0x1122334455667788);
3399451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 4)
3499451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
35619e2e09SDave Lee        self.assertEqual(addr, 0x44332211);
3699451b44SJordan Rupprecht        data.SetData(error, addr_data, lldb.eByteOrderLittle, 8)
3799451b44SJordan Rupprecht        addr = data.GetAddress(error, 0)
38619e2e09SDave Lee        self.assertEqual(addr, 0x8877665544332211);
3999451b44SJordan Rupprecht
4072e25978SMed Ismail Bennani    def test_byte_order_and_address_byte_size_with_ownership(self):
4172e25978SMed Ismail Bennani        """Test the SBData::SetDataWithOwnership() to ensure the byte order
4272e25978SMed Ismail Bennani        and address byte size are obeyed even when source date is released"""
4372e25978SMed Ismail Bennani        addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88'
4472e25978SMed Ismail Bennani        error = lldb.SBError()
4572e25978SMed Ismail Bennani        data = lldb.SBData()
4672e25978SMed Ismail Bennani        data.SetDataWithOwnership(error, addr_data, lldb.eByteOrderBig, 8)
4772e25978SMed Ismail Bennani        del addr_data
4872e25978SMed Ismail Bennani        addr = data.GetAddress(error, 0)
4972e25978SMed Ismail Bennani        self.assertEqual(addr, 0x1122334455667788);
5072e25978SMed Ismail Bennani
5199451b44SJordan Rupprecht    def test_with_run_command(self):
5299451b44SJordan Rupprecht        """Test the SBData APIs."""
5399451b44SJordan Rupprecht        self.build()
5499451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
5799451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
6299451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
6399451b44SJordan Rupprecht                    substrs=['stopped',
6499451b44SJordan Rupprecht                             'stop reason = breakpoint'])
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        target = self.dbg.GetSelectedTarget()
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        process = target.GetProcess()
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
7199451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
7299451b44SJordan Rupprecht        self.assertIsNotNone(thread)
7399451b44SJordan Rupprecht
7499451b44SJordan Rupprecht        frame = thread.GetSelectedFrame()
7599451b44SJordan Rupprecht        foobar = frame.FindVariable('foobar')
7699451b44SJordan Rupprecht        self.assertTrue(foobar.IsValid())
7799451b44SJordan Rupprecht        data = foobar.GetPointeeData(0, 2)
7899451b44SJordan Rupprecht        offset = 0
7999451b44SJordan Rupprecht        error = lldb.SBError()
8099451b44SJordan Rupprecht
8199451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
8299451b44SJordan Rupprecht        offset += 4
8399451b44SJordan Rupprecht        low = data.GetSignedInt16(error, offset)
84*779bbbf2SDave Lee        self.assertSuccess(error)
8599451b44SJordan Rupprecht        offset += 2
8699451b44SJordan Rupprecht        high = data.GetSignedInt16(error, offset)
87*779bbbf2SDave Lee        self.assertSuccess(error)
8899451b44SJordan Rupprecht        offset += 2
8999451b44SJordan Rupprecht        self.assertTrue(
9099451b44SJordan Rupprecht            (low == 9 and high == 0) or (
9199451b44SJordan Rupprecht                low == 0 and high == 9),
9299451b44SJordan Rupprecht            'foo[0].b == 9')
9399451b44SJordan Rupprecht        self.assertTrue(
9499451b44SJordan Rupprecht            fabs(
9599451b44SJordan Rupprecht                data.GetFloat(
9699451b44SJordan Rupprecht                    error,
9799451b44SJordan Rupprecht                    offset) -
9899451b44SJordan Rupprecht                3.14) < 1,
9999451b44SJordan Rupprecht            'foo[0].c == 3.14')
100*779bbbf2SDave Lee        self.assertSuccess(error)
10199451b44SJordan Rupprecht        offset += 4
10299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
10399451b44SJordan Rupprecht        offset += 4
10499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
10599451b44SJordan Rupprecht        offset += 4
10699451b44SJordan Rupprecht
10799451b44SJordan Rupprecht        self.runCmd("n")
10899451b44SJordan Rupprecht
10999451b44SJordan Rupprecht        offset = 16
11099451b44SJordan Rupprecht
11199451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht        data = foobar.GetPointeeData(1, 1)
11499451b44SJordan Rupprecht
11599451b44SJordan Rupprecht        offset = 0
11699451b44SJordan Rupprecht
11799451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 8)
11899451b44SJordan Rupprecht        offset += 4
11999451b44SJordan Rupprecht        self.assert_data(data.GetSignedInt32, offset, 7)
12099451b44SJordan Rupprecht        offset += 8
12199451b44SJordan Rupprecht        self.assertTrue(
12299451b44SJordan Rupprecht            data.GetUnsignedInt32(
12399451b44SJordan Rupprecht                error,
12499451b44SJordan Rupprecht                offset) == 0,
12599451b44SJordan Rupprecht            'do not read beyond end')
12699451b44SJordan Rupprecht        self.assertTrue(not error.Success())
12799451b44SJordan Rupprecht        error.Clear()  # clear the error for the next test
12899451b44SJordan Rupprecht
12999451b44SJordan Rupprecht        star_foobar = foobar.Dereference()
13099451b44SJordan Rupprecht        self.assertTrue(star_foobar.IsValid())
13199451b44SJordan Rupprecht
13299451b44SJordan Rupprecht        data = star_foobar.GetData()
13399451b44SJordan Rupprecht
13499451b44SJordan Rupprecht        offset = 0
13599451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
13699451b44SJordan Rupprecht        offset += 4
13799451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 9)
13899451b44SJordan Rupprecht
13999451b44SJordan Rupprecht        foobar_addr = star_foobar.GetLoadAddress()
14099451b44SJordan Rupprecht        foobar_addr += 12
14199451b44SJordan Rupprecht
14299451b44SJordan Rupprecht        # http://llvm.org/bugs/show_bug.cgi?id=11579
14399451b44SJordan Rupprecht        # lldb::SBValue::CreateValueFromAddress does not verify SBType::GetPointerType succeeds
14499451b44SJordan Rupprecht        # This should not crash LLDB.
14599451b44SJordan Rupprecht        nothing = foobar.CreateValueFromAddress(
14699451b44SJordan Rupprecht            "nothing", foobar_addr, star_foobar.GetType().GetBasicType(
14799451b44SJordan Rupprecht                lldb.eBasicTypeInvalid))
14899451b44SJordan Rupprecht
14999451b44SJordan Rupprecht        new_foobar = foobar.CreateValueFromAddress(
15099451b44SJordan Rupprecht            "f00", foobar_addr, star_foobar.GetType())
15199451b44SJordan Rupprecht        self.assertTrue(new_foobar.IsValid())
15299451b44SJordan Rupprecht        data = new_foobar.GetData()
15399451b44SJordan Rupprecht
154619e2e09SDave Lee        self.assertEqual(data.uint32[0], 8, 'then foo[1].a == 8')
155619e2e09SDave Lee        self.assertEqual(data.uint32[1], 7, 'then foo[1].b == 7')
15699451b44SJordan Rupprecht        # exploiting that sizeof(uint32) == sizeof(float)
15799451b44SJordan Rupprecht        self.assertTrue(fabs(data.float[2] - 3.14) < 1, 'foo[1].c == 3.14')
15899451b44SJordan Rupprecht
15999451b44SJordan Rupprecht        self.runCmd("n")
16099451b44SJordan Rupprecht
16199451b44SJordan Rupprecht        offset = 0
16299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
16399451b44SJordan Rupprecht        offset += 4
16499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
16599451b44SJordan Rupprecht        offset += 4
16699451b44SJordan Rupprecht        self.assertTrue(
16799451b44SJordan Rupprecht            fabs(
16899451b44SJordan Rupprecht                data.GetFloat(
16999451b44SJordan Rupprecht                    error,
17099451b44SJordan Rupprecht                    offset) -
17199451b44SJordan Rupprecht                3.14) < 1,
17299451b44SJordan Rupprecht            'foo[1].c == 3.14')
173*779bbbf2SDave Lee        self.assertSuccess(error)
17499451b44SJordan Rupprecht
17599451b44SJordan Rupprecht        data = new_foobar.GetData()
17699451b44SJordan Rupprecht
17799451b44SJordan Rupprecht        offset = 0
17899451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 8)
17999451b44SJordan Rupprecht        offset += 4
18099451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 7)
18199451b44SJordan Rupprecht        offset += 4
18299451b44SJordan Rupprecht        self.assertTrue(
18399451b44SJordan Rupprecht            fabs(
18499451b44SJordan Rupprecht                data.GetFloat(
18599451b44SJordan Rupprecht                    error,
18699451b44SJordan Rupprecht                    offset) -
18799451b44SJordan Rupprecht                6.28) < 1,
18899451b44SJordan Rupprecht            'foo[1].c == 6.28')
189*779bbbf2SDave Lee        self.assertSuccess(error)
19099451b44SJordan Rupprecht
19199451b44SJordan Rupprecht        self.runCmd("n")
19299451b44SJordan Rupprecht
19399451b44SJordan Rupprecht        barfoo = frame.FindVariable('barfoo')
19499451b44SJordan Rupprecht
19599451b44SJordan Rupprecht        data = barfoo.GetData()
19699451b44SJordan Rupprecht        offset = 0
19799451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 1)
19899451b44SJordan Rupprecht        offset += 4
19999451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 2)
20099451b44SJordan Rupprecht        offset += 4
20199451b44SJordan Rupprecht        self.assertTrue(
20299451b44SJordan Rupprecht            fabs(
20399451b44SJordan Rupprecht                data.GetFloat(
20499451b44SJordan Rupprecht                    error,
20599451b44SJordan Rupprecht                    offset) -
20699451b44SJordan Rupprecht                3) < 1,
20799451b44SJordan Rupprecht            'barfoo[0].c == 3')
208*779bbbf2SDave Lee        self.assertSuccess(error)
20999451b44SJordan Rupprecht        offset += 4
21099451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 4)
21199451b44SJordan Rupprecht        offset += 4
21299451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 5)
21399451b44SJordan Rupprecht        offset += 4
21499451b44SJordan Rupprecht        self.assertTrue(
21599451b44SJordan Rupprecht            fabs(
21699451b44SJordan Rupprecht                data.GetFloat(
21799451b44SJordan Rupprecht                    error,
21899451b44SJordan Rupprecht                    offset) -
21999451b44SJordan Rupprecht                6) < 1,
22099451b44SJordan Rupprecht            'barfoo[1].c == 6')
221*779bbbf2SDave Lee        self.assertSuccess(error)
22299451b44SJordan Rupprecht
22399451b44SJordan Rupprecht        new_object = barfoo.CreateValueFromData(
22499451b44SJordan Rupprecht            "new_object", data, barfoo.GetType().GetBasicType(
22599451b44SJordan Rupprecht                lldb.eBasicTypeInt))
226619e2e09SDave Lee        self.assertEqual(new_object.GetValue(), "1", 'new_object == 1')
22799451b44SJordan Rupprecht
22899451b44SJordan Rupprecht        if data.GetByteOrder() == lldb.eByteOrderBig:
22999451b44SJordan Rupprecht            data.SetData(
23099451b44SJordan Rupprecht                error,
23199451b44SJordan Rupprecht                '\0\0\0A',
23299451b44SJordan Rupprecht                data.GetByteOrder(),
23399451b44SJordan Rupprecht                data.GetAddressByteSize())
23499451b44SJordan Rupprecht        else:
23599451b44SJordan Rupprecht            data.SetData(
23699451b44SJordan Rupprecht                error,
23799451b44SJordan Rupprecht                'A\0\0\0',
23899451b44SJordan Rupprecht                data.GetByteOrder(),
23999451b44SJordan Rupprecht                data.GetAddressByteSize())
240*779bbbf2SDave Lee        self.assertSuccess(error)
24199451b44SJordan Rupprecht
24299451b44SJordan Rupprecht        data2 = lldb.SBData()
24399451b44SJordan Rupprecht        data2.SetData(
24499451b44SJordan Rupprecht            error,
24599451b44SJordan Rupprecht            'BCD',
24699451b44SJordan Rupprecht            data.GetByteOrder(),
24799451b44SJordan Rupprecht            data.GetAddressByteSize())
248*779bbbf2SDave Lee        self.assertSuccess(error)
24999451b44SJordan Rupprecht
25099451b44SJordan Rupprecht        data.Append(data2)
25199451b44SJordan Rupprecht
25299451b44SJordan Rupprecht        # this breaks on EBCDIC
25399451b44SJordan Rupprecht        offset = 0
25499451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt32, offset, 65)
25599451b44SJordan Rupprecht        offset += 4
25699451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 66)
25799451b44SJordan Rupprecht        offset += 1
25899451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 67)
25999451b44SJordan Rupprecht        offset += 1
26099451b44SJordan Rupprecht        self.assert_data(data.GetUnsignedInt8, offset, 68)
26199451b44SJordan Rupprecht        offset += 1
26299451b44SJordan Rupprecht
26399451b44SJordan Rupprecht        # check the new API calls introduced per LLVM llvm.org/prenhancement request
26499451b44SJordan Rupprecht        # 11619 (Allow creating SBData values from arrays or primitives in
26599451b44SJordan Rupprecht        # Python)
26699451b44SJordan Rupprecht
26799451b44SJordan Rupprecht        hello_str = "hello!"
26899451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromCString(
26999451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), hello_str)
270619e2e09SDave Lee        self.assertEqual(len(data2.uint8), len(hello_str))
271619e2e09SDave Lee        self.assertEqual(data2.uint8[0], 104, 'h == 104')
272619e2e09SDave Lee        self.assertEqual(data2.uint8[1], 101, 'e == 101')
273619e2e09SDave Lee        self.assertEqual(data2.uint8[2], 108, 'l == 108')
27499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)  # l
275619e2e09SDave Lee        self.assertEqual(data2.uint8[4], 111, 'o == 111')
27699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)  # !
27799451b44SJordan Rupprecht
27899451b44SJordan Rupprecht        uint_lists = [[1, 2, 3, 4, 5], [int(i) for i in [1, 2, 3, 4, 5]]]
27999451b44SJordan Rupprecht        int_lists = [[2, -2], [int(i) for i in [2, -2]]]
28099451b44SJordan Rupprecht
28199451b44SJordan Rupprecht        for l in uint_lists:
28299451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt64Array(
28399451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
28499451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 0, 1)
28599451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 8, 2)
28699451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 16, 3)
28799451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 24, 4)
28899451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt64, 32, 5)
28999451b44SJordan Rupprecht
29099451b44SJordan Rupprecht            self.assertTrue(
29199451b44SJordan Rupprecht                data2.uint64s == [
29299451b44SJordan Rupprecht                    1,
29399451b44SJordan Rupprecht                    2,
29499451b44SJordan Rupprecht                    3,
29599451b44SJordan Rupprecht                    4,
29699451b44SJordan Rupprecht                    5],
29799451b44SJordan Rupprecht                'read_data_helper failure: data2 == [1,2,3,4,5]')
29899451b44SJordan Rupprecht
29999451b44SJordan Rupprecht        for l in int_lists:
30099451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt32Array(
30199451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
30299451b44SJordan Rupprecht            self.assertTrue(
30399451b44SJordan Rupprecht                data2.sint32[
30499451b44SJordan Rupprecht                    0:2] == [
30599451b44SJordan Rupprecht                    2, -2], 'signed32 data2 = [2,-2]')
30699451b44SJordan Rupprecht
30799451b44SJordan Rupprecht        data2.Append(
30899451b44SJordan Rupprecht            lldb.SBData.CreateDataFromSInt64Array(
30999451b44SJordan Rupprecht                process.GetByteOrder(),
31099451b44SJordan Rupprecht                process.GetAddressByteSize(),
31199451b44SJordan Rupprecht                int_lists[0]))
31299451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
31399451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
31499451b44SJordan Rupprecht        self.assertTrue(
31599451b44SJordan Rupprecht            data2.sint64[
31699451b44SJordan Rupprecht                1:3] == [
31799451b44SJordan Rupprecht                2, -2], 'signed64 data2 = [2,-2]')
31899451b44SJordan Rupprecht
31999451b44SJordan Rupprecht        for l in int_lists:
32099451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromSInt64Array(
32199451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
32299451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 0, 2)
32399451b44SJordan Rupprecht            self.assert_data(data2.GetSignedInt64, 8, -2)
32499451b44SJordan Rupprecht            self.assertTrue(
32599451b44SJordan Rupprecht                data2.sint64[
32699451b44SJordan Rupprecht                    0:2] == [
32799451b44SJordan Rupprecht                    2, -2], 'signed64 data2 = [2,-2]')
32899451b44SJordan Rupprecht
32999451b44SJordan Rupprecht        for l in uint_lists:
33099451b44SJordan Rupprecht            data2 = lldb.SBData.CreateDataFromUInt32Array(
33199451b44SJordan Rupprecht                process.GetByteOrder(), process.GetAddressByteSize(), l)
33299451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 0, 1)
33399451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 4, 2)
33499451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 8, 3)
33599451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 12, 4)
33699451b44SJordan Rupprecht            self.assert_data(data2.GetUnsignedInt32, 16, 5)
33799451b44SJordan Rupprecht
33899451b44SJordan Rupprecht        bool_list = [True, True, False, False, True, False]
33999451b44SJordan Rupprecht
34099451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt32Array(
34199451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
34299451b44SJordan Rupprecht        self.assertTrue(
34399451b44SJordan Rupprecht            data2.sint32[
34499451b44SJordan Rupprecht                0:6] == [
34599451b44SJordan Rupprecht                1,
34699451b44SJordan Rupprecht                1,
34799451b44SJordan Rupprecht                0,
34899451b44SJordan Rupprecht                0,
34999451b44SJordan Rupprecht                1,
35099451b44SJordan Rupprecht                0],
35199451b44SJordan Rupprecht            'signed32 data2 = [1, 1, 0, 0, 1, 0]')
35299451b44SJordan Rupprecht
35399451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt32Array(
35499451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
35599451b44SJordan Rupprecht        self.assertTrue(
35699451b44SJordan Rupprecht            data2.uint32[
35799451b44SJordan Rupprecht                0:6] == [
35899451b44SJordan Rupprecht                1,
35999451b44SJordan Rupprecht                1,
36099451b44SJordan Rupprecht                0,
36199451b44SJordan Rupprecht                0,
36299451b44SJordan Rupprecht                1,
36399451b44SJordan Rupprecht                0],
36499451b44SJordan Rupprecht            'unsigned32 data2 = [1, 1, 0, 0, 1, 0]')
36599451b44SJordan Rupprecht
36699451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromSInt64Array(
36799451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
36899451b44SJordan Rupprecht        self.assertTrue(
36999451b44SJordan Rupprecht            data2.sint64[
37099451b44SJordan Rupprecht                0:6] == [
37199451b44SJordan Rupprecht                1,
37299451b44SJordan Rupprecht                1,
37399451b44SJordan Rupprecht                0,
37499451b44SJordan Rupprecht                0,
37599451b44SJordan Rupprecht                1,
37699451b44SJordan Rupprecht                0],
37799451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
37899451b44SJordan Rupprecht
37999451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromUInt64Array(
38099451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), bool_list)
38199451b44SJordan Rupprecht        self.assertTrue(
38299451b44SJordan Rupprecht            data2.uint64[
38399451b44SJordan Rupprecht                0:6] == [
38499451b44SJordan Rupprecht                1,
38599451b44SJordan Rupprecht                1,
38699451b44SJordan Rupprecht                0,
38799451b44SJordan Rupprecht                0,
38899451b44SJordan Rupprecht                1,
38999451b44SJordan Rupprecht                0],
39099451b44SJordan Rupprecht            'signed64 data2 = [1, 1, 0, 0, 1, 0]')
39199451b44SJordan Rupprecht
39299451b44SJordan Rupprecht        data2 = lldb.SBData.CreateDataFromDoubleArray(
39399451b44SJordan Rupprecht            process.GetByteOrder(), process.GetAddressByteSize(), [
39499451b44SJordan Rupprecht                3.14, 6.28, 2.71])
39599451b44SJordan Rupprecht        self.assertTrue(
39699451b44SJordan Rupprecht            fabs(
39799451b44SJordan Rupprecht                data2.GetDouble(
39899451b44SJordan Rupprecht                    error,
39999451b44SJordan Rupprecht                    0) -
40099451b44SJordan Rupprecht                3.14) < 0.5,
40199451b44SJordan Rupprecht            'double data2[0] = 3.14')
402*779bbbf2SDave Lee        self.assertSuccess(error)
40399451b44SJordan Rupprecht        self.assertTrue(
40499451b44SJordan Rupprecht            fabs(
40599451b44SJordan Rupprecht                data2.GetDouble(
40699451b44SJordan Rupprecht                    error,
40799451b44SJordan Rupprecht                    8) -
40899451b44SJordan Rupprecht                6.28) < 0.5,
40999451b44SJordan Rupprecht            'double data2[1] = 6.28')
410*779bbbf2SDave Lee        self.assertSuccess(error)
41199451b44SJordan Rupprecht        self.assertTrue(
41299451b44SJordan Rupprecht            fabs(
41399451b44SJordan Rupprecht                data2.GetDouble(
41499451b44SJordan Rupprecht                    error,
41599451b44SJordan Rupprecht                    16) -
41699451b44SJordan Rupprecht                2.71) < 0.5,
41799451b44SJordan Rupprecht            'double data2[2] = 2.71')
418*779bbbf2SDave Lee        self.assertSuccess(error)
41999451b44SJordan Rupprecht
42099451b44SJordan Rupprecht        data2 = lldb.SBData()
42199451b44SJordan Rupprecht
42299451b44SJordan Rupprecht        data2.SetDataFromCString(hello_str)
423619e2e09SDave Lee        self.assertEqual(len(data2.uint8), len(hello_str))
42499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 0, 104)
42599451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 1, 101)
42699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 2, 108)
42799451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 3, 108)
42899451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 4, 111)
42999451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt8, 5, 33)
43099451b44SJordan Rupprecht
43199451b44SJordan Rupprecht        data2.SetDataFromUInt64Array([1, 2, 3, 4, 5])
43299451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 0, 1)
43399451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 8, 2)
43499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 16, 3)
43599451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 24, 4)
43699451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt64, 32, 5)
43799451b44SJordan Rupprecht
4380ed758b2SDave Lee        self.assertEqual(
4390ed758b2SDave Lee            data2.uint64[0], 1,
44099451b44SJordan Rupprecht            'read_data_helper failure: set data2[0] = 1')
4410ed758b2SDave Lee        self.assertEqual(
4420ed758b2SDave Lee            data2.uint64[1], 2,
44399451b44SJordan Rupprecht            'read_data_helper failure: set data2[1] = 2')
4440ed758b2SDave Lee        self.assertEqual(
4450ed758b2SDave Lee            data2.uint64[2], 3,
44699451b44SJordan Rupprecht            'read_data_helper failure: set data2[2] = 3')
4470ed758b2SDave Lee        self.assertEqual(
4480ed758b2SDave Lee            data2.uint64[3], 4,
44999451b44SJordan Rupprecht            'read_data_helper failure: set data2[3] = 4')
4500ed758b2SDave Lee        self.assertEqual(
4510ed758b2SDave Lee            data2.uint64[4], 5,
45299451b44SJordan Rupprecht            'read_data_helper failure: set data2[4] = 5')
45399451b44SJordan Rupprecht
45499451b44SJordan Rupprecht        self.assertTrue(
45599451b44SJordan Rupprecht            data2.uint64[
45699451b44SJordan Rupprecht                0:2] == [
45799451b44SJordan Rupprecht                1,
45899451b44SJordan Rupprecht                2],
45999451b44SJordan Rupprecht            'read_data_helper failure: set data2[0:2] = [1,2]')
46099451b44SJordan Rupprecht
46199451b44SJordan Rupprecht        data2.SetDataFromSInt32Array([2, -2])
46299451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 0, 2)
46399451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt32, 4, -2)
46499451b44SJordan Rupprecht
46599451b44SJordan Rupprecht        data2.SetDataFromSInt64Array([2, -2])
46699451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 0, 2)
46799451b44SJordan Rupprecht        self.assert_data(data2.GetSignedInt64, 8, -2)
46899451b44SJordan Rupprecht
46999451b44SJordan Rupprecht        data2.SetDataFromUInt32Array([1, 2, 3, 4, 5])
47099451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 0, 1)
47199451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 4, 2)
47299451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 8, 3)
47399451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 12, 4)
47499451b44SJordan Rupprecht        self.assert_data(data2.GetUnsignedInt32, 16, 5)
47599451b44SJordan Rupprecht
4760ed758b2SDave Lee        self.assertEqual(
4770ed758b2SDave Lee            data2.uint32[0], 1,
47899451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[0] = 1')
4790ed758b2SDave Lee        self.assertEqual(
4800ed758b2SDave Lee            data2.uint32[1], 2,
48199451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[1] = 2')
4820ed758b2SDave Lee        self.assertEqual(
4830ed758b2SDave Lee            data2.uint32[2], 3,
48499451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[2] = 3')
4850ed758b2SDave Lee        self.assertEqual(
4860ed758b2SDave Lee            data2.uint32[3], 4,
48799451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[3] = 4')
4880ed758b2SDave Lee        self.assertEqual(
4890ed758b2SDave Lee            data2.uint32[4], 5,
49099451b44SJordan Rupprecht            'read_data_helper failure: set 32-bit data2[4] = 5')
49199451b44SJordan Rupprecht
49299451b44SJordan Rupprecht        data2.SetDataFromDoubleArray([3.14, 6.28, 2.71])
49399451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 0) - 3.14)
49499451b44SJordan Rupprecht                        < 0.5, 'set double data2[0] = 3.14')
49599451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 8) - 6.28)
49699451b44SJordan Rupprecht                        < 0.5, 'set double data2[1] = 6.28')
49799451b44SJordan Rupprecht        self.assertTrue(fabs(data2.GetDouble(error, 16) - 2.71)
49899451b44SJordan Rupprecht                        < 0.5, 'set double data2[2] = 2.71')
49999451b44SJordan Rupprecht
50099451b44SJordan Rupprecht        self.assertTrue(
50199451b44SJordan Rupprecht            fabs(
50299451b44SJordan Rupprecht                data2.double[0] -
50399451b44SJordan Rupprecht                3.14) < 0.5,
50499451b44SJordan Rupprecht            'read_data_helper failure: set double data2[0] = 3.14')
50599451b44SJordan Rupprecht        self.assertTrue(
50699451b44SJordan Rupprecht            fabs(
50799451b44SJordan Rupprecht                data2.double[1] -
50899451b44SJordan Rupprecht                6.28) < 0.5,
50999451b44SJordan Rupprecht            'read_data_helper failure: set double data2[1] = 6.28')
51099451b44SJordan Rupprecht        self.assertTrue(
51199451b44SJordan Rupprecht            fabs(
51299451b44SJordan Rupprecht                data2.double[2] -
51399451b44SJordan Rupprecht                2.71) < 0.5,
51499451b44SJordan Rupprecht            'read_data_helper failure: set double data2[2] = 2.71')
51599451b44SJordan Rupprecht
51699451b44SJordan Rupprecht    def assert_data(self, func, arg, expected):
51799451b44SJordan Rupprecht        """ Asserts func(SBError error, arg) == expected. """
51899451b44SJordan Rupprecht        error = lldb.SBError()
51999451b44SJordan Rupprecht        result = func(error, arg)
52099451b44SJordan Rupprecht        if not error.Success():
52199451b44SJordan Rupprecht            stream = lldb.SBStream()
52299451b44SJordan Rupprecht            error.GetDescription(stream)
52399451b44SJordan Rupprecht            self.assertTrue(
52499451b44SJordan Rupprecht                error.Success(), "%s(error, %s) did not succeed: %s" %
52599451b44SJordan Rupprecht                (func.__name__, arg, stream.GetData()))
52699451b44SJordan Rupprecht        self.assertTrue(
52799451b44SJordan Rupprecht            expected == result, "%s(error, %s) == %s != %s" %
52899451b44SJordan Rupprecht            (func.__name__, arg, result, expected))
529