Ejemplo n.º 1
0
 def test_array_of_pointers_to_array(self):
     prog = mock_program()
     self.assertEqual(
         prog.type("int (*[2])[3]"),
         array_type(
             2, pointer_type(8, array_type(3, int_type("int", 4, True)))),
     )
Ejemplo n.º 2
0
 def test_array_of_pointers_to_array(self):
     self.assertTypeName(
         array_type(
             2, pointer_type(8, array_type(3, int_type("int", 4, True)))),
         "int (*[2])[3]",
         True,
     )
Ejemplo n.º 3
0
    def test_union(self):
        t = union_type(
            "foo",
            4,
            (
                (int_type("int", 4, True), "i"),
                (array_type(4, int_type("unsigned char", 1, False)), "a"),
            ),
        )
        self.assertPrettyPrint(
            t,
            """\
union foo {
	int i;
	unsigned char a[4];
}""",
        )

        t = union_type(
            "foo",
            4,
            (
                (int_type("int", 4, True), "i"),
                (array_type(4, int_type("unsigned char", 1, False)), "a"),
            ),
            Qualifiers.CONST,
        )
        self.assertPrettyPrint(
            t,
            """\
const union foo {
	int i;
	unsigned char a[4];
}""",
        )
Ejemplo n.º 4
0
 def test_array_of_pointers(self):
     self.assertTypeName(
         array_type(
             2, array_type(3, pointer_type(8, int_type("int", 4, True)))),
         "int *[2][3]",
         True,
     )
Ejemplo n.º 5
0
 def test_pointer_to_array(self):
     prog = mock_program()
     self.assertEqual(
         prog.type('int (*)[2]'),
         pointer_type(8, array_type(2, int_type('int', 4, True))))
     self.assertEqual(
         prog.type('int (*)[2][3]'),
         pointer_type(
             8, array_type(2, array_type(3, int_type('int', 4, True)))))
Ejemplo n.º 6
0
 def test_pointer_to_array_of_pointers(self):
     prog = mock_program()
     self.assertEqual(
         prog.type('int *(*)[2]'),
         pointer_type(
             8, array_type(2, pointer_type(8, int_type('int', 4, True)))))
     self.assertEqual(
         prog.type('int *((*)[2])'),
         pointer_type(
             8, array_type(2, pointer_type(8, int_type('int', 4, True)))))
Ejemplo n.º 7
0
 def test_pointer_to_pointer_to_array(self):
     self.assertTypeName(
         pointer_type(
             8, pointer_type(8, array_type(2, int_type("int", 4, True)))),
         "int (**)[2]",
         True,
     )
Ejemplo n.º 8
0
 def test_pointer_to_pointer_to_array(self):
     prog = mock_program()
     self.assertEqual(
         prog.type("int (**)[2]"),
         pointer_type(
             8, pointer_type(8, array_type(2, int_type("int", 4, True)))),
     )
Ejemplo n.º 9
0
 def test_array_of_pointers_to_functions(self):
     i = int_type("int", 4, True)
     self.assertTypeName(
         array_type(4, pointer_type(8, function_type(i, ((i,),), False))),
         "int (*[4])(int)",
         True,
     )
Ejemplo n.º 10
0
 def test_pointer_to_array_of_pointers(self):
     self.assertTypeName(
         pointer_type(
             8, array_type(2, pointer_type(8, int_type("int", 4, True)))),
         "int *(*)[2]",
         True,
     )
Ejemplo n.º 11
0
 def test_array_of_const_pointers_to_functions(self):
     i = int_type('int', 4, True)
     self.assertTypeName(
         array_type(
             None,
             pointer_type(8, function_type(i, ((i, ), ), False),
                          Qualifiers.CONST)), 'int (* const [])(int)', True)
Ejemplo n.º 12
0
 def test_array(self):
     i = int_type('int', 4, True)
     self.assertTypeName(array_type(None, i), 'int []', True)
     self.assertTypeName(array_type(2, i), 'int [2]', True)
     self.assertTypeName(array_type(2, array_type(3, i)), 'int [2][3]',
                         True)
     self.assertTypeName(array_type(2, array_type(3, array_type(4, i))),
                         'int [2][3][4]', True)
Ejemplo n.º 13
0
 def test_array(self):
     i = int_type("int", 4, True)
     self.assertTypeName(array_type(None, i), "int []", True)
     self.assertTypeName(array_type(2, i), "int [2]", True)
     self.assertTypeName(array_type(2, array_type(3, i)), "int [2][3]", True)
     self.assertTypeName(
         array_type(2, array_type(3, array_type(4, i))), "int [2][3][4]", True
     )
Ejemplo n.º 14
0
 def test_array_of_const_pointers_to_functions(self):
     i = int_type("int", 4, True)
     self.assertTypeName(
         array_type(
             None,
             pointer_type(8, function_type(i, (TypeParameter(i), ), False),
                          Qualifiers.CONST),
         ),
         "int (* const [])(int)",
         True,
     )
Ejemplo n.º 15
0
 def test_array(self):
     prog = mock_program()
     self.assertEqual(prog.type('int []'),
                      array_type(None, int_type('int', 4, True)))
     self.assertEqual(prog.type('int [20]'),
                      array_type(20, int_type('int', 4, True)))
     self.assertEqual(prog.type('int [0x20]'),
                      array_type(32, int_type('int', 4, True)))
     self.assertEqual(prog.type('int [020]'),
                      array_type(16, int_type('int', 4, True)))
     self.assertEqual(
         prog.type('int [2][3]'),
         array_type(2, array_type(3, int_type('int', 4, True))))
     self.assertEqual(
         prog.type('int [2][3][4]'),
         array_type(2, array_type(3, array_type(4, int_type('int', 4,
                                                            True)))))
Ejemplo n.º 16
0
    def test_union(self):
        t = union_type('foo', 4, (
            (int_type('int', 4, True), 'i'),
            (array_type(4, int_type('unsigned char', 1, False)), 'a'),
        ))
        self.assertPrettyPrint(
            t, """\
union foo {
	int i;
	unsigned char a[4];
}""")

        t = union_type('foo', 4, (
            (int_type('int', 4, True), 'i'),
            (array_type(4, int_type('unsigned char', 1, False)), 'a'),
        ), Qualifiers.CONST)
        self.assertPrettyPrint(
            t, """\
const union foo {
	int i;
	unsigned char a[4];
}""")
Ejemplo n.º 17
0
def type_canonicalize(t: drgn.Type) -> drgn.Type:
    """
    Return the "canonical" version of this type.  This means removing
    qualifiers (const, volatile, etc) and typedef's.

    For example the type `foo_t*` will be canonicalized to `struct foo *`.

    Note: function type's arguments and return types are not canonicalized.
    """
    if t.kind == drgn.TypeKind.TYPEDEF:
        return type_canonicalize(t.type)
    if t.kind == drgn.TypeKind.POINTER:
        return drgn.pointer_type(t.size, type_canonicalize(t.type))
    if t.kind == drgn.TypeKind.ARRAY:
        return drgn.array_type(t.length, type_canonicalize(t.type))
    return t.unqualified()
Ejemplo n.º 18
0
    def test_array(self):
        t = array_type(10, int_type("int", 4, True))
        self.assertEqual(t.kind, TypeKind.ARRAY)
        self.assertIsNone(t.primitive)
        self.assertEqual(t.language, DEFAULT_LANGUAGE)
        self.assertEqual(t.length, 10)
        self.assertEqual(t.type, int_type("int", 4, True))
        self.assertTrue(t.is_complete())

        self.assertEqual(t, array_type(10, int_type("int", 4, True)))
        # Qualified type argument.
        self.assertEqual(t, array_type(10, int_type("int", 4, True)))
        # Different length.
        self.assertNotEqual(t, array_type(4, int_type("int", 4, True)))
        # Different type.
        self.assertNotEqual(t, array_type(10, void_type()))
        self.assertNotEqual(t, array_type(10, void_type(Qualifiers.CONST)))

        self.assertEqual(
            repr(t),
            "array_type(length=10, type=int_type(name='int', size=4, is_signed=True))",
        )
        self.assertEqual(sizeof(t), 40)

        t = array_type(0, int_type("int", 4, True))
        self.assertEqual(t.kind, TypeKind.ARRAY)
        self.assertIsNone(t.primitive)
        self.assertEqual(t.length, 0)
        self.assertEqual(t.type, int_type("int", 4, True))
        self.assertTrue(t.is_complete())

        t = array_type(None, int_type("int", 4, True))
        self.assertEqual(t.kind, TypeKind.ARRAY)
        self.assertIsNone(t.primitive)
        self.assertIsNone(t.length)
        self.assertEqual(t.type, int_type("int", 4, True))
        self.assertFalse(t.is_complete())

        self.assertRaises(TypeError, array_type, 10, 4)
Ejemplo n.º 19
0
 def test_array_of_pointers(self):
     prog = mock_program()
     self.assertEqual(
         prog.type('int *[2][3]'),
         array_type(
             2, array_type(3, pointer_type(8, int_type('int', 4, True)))))
Ejemplo n.º 20
0
 def test_array_of_pointers(self):
     self.assertTypeName(
         array_type(
             2, array_type(3, pointer_type(8, int_type('int', 4, True)))),
         'int *[2][3]', True)
Ejemplo n.º 21
0
 def test_pointer_to_pointer_to_array(self):
     self.assertTypeName(
         pointer_type(
             8, pointer_type(8, array_type(2, int_type('int', 4, True)))),
         'int (**)[2]', True)
Ejemplo n.º 22
0
 def test_pointer_to_array_of_pointers(self):
     self.assertTypeName(
         pointer_type(
             8, array_type(2, pointer_type(8, int_type('int', 4, True)))),
         'int *(*)[2]', True)
Ejemplo n.º 23
0
 def test_array_of_pointers_to_array(self):
     self.assertTypeName(
         array_type(
             2, pointer_type(8, array_type(3, int_type('int', 4, True)))),
         'int (*[2])[3]', True)