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)))), )
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, )
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]; }""", )
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, )
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)))))
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)))))
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, )
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)))), )
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, )
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, )
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)
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)
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 )
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, )
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)))))
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]; }""")
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()
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)
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)))))
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)
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)
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)
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)