예제 #1
0
 def test_pointer_to_function(self):
     i = self.prog.int_type("int", 4, True)
     self.assertTypeName(
         self.prog.pointer_type(
             self.prog.function_type(i, (TypeParameter(i),), False)
         ),
         "int (*)(int)",
         True,
     )
     self.assertTypeName(
         self.prog.pointer_type(
             self.prog.function_type(i, (TypeParameter(i, "x"),), False)
         ),
         "int (*)(int x)",
         True,
     )
     self.assertTypeName(
         self.prog.pointer_type(
             self.prog.function_type(
                 i,
                 (
                     TypeParameter(i),
                     TypeParameter(self.prog.float_type("float", 4)),
                 ),
                 False,
             ),
         ),
         "int (*)(int, float)",
         True,
     )
예제 #2
0
    def test_callable(self):
        p = TypeParameter(self.prog.void_type)
        self.assertIdentical(p.type, self.prog.void_type())

        p = TypeParameter(lambda: self.prog.int_type("int", 4, True))
        self.assertIdentical(p.type, self.prog.int_type("int", 4, True))

        p = TypeParameter(lambda: None)
        self.assertRaises(TypeError, getattr, p, "type")
예제 #3
0
파일: test_type.py 프로젝트: zeta1999/drgn
    def test_callable(self):
        p = TypeParameter(void_type)
        self.assertEqual(p.type, void_type())

        p = TypeParameter(lambda: int_type("int", 4, True))
        self.assertEqual(p.type, int_type("int", 4, True))

        p = TypeParameter(lambda: None)
        self.assertRaises(TypeError, getattr, p, "type")
예제 #4
0
    def test_repr(self):
        p = TypeParameter(self.prog.void_type, name="foo")
        self.assertEqual(repr(p),
                         "TypeParameter(prog.type('void'), name='foo')")

        p = TypeParameter(self.prog.void_type)
        self.assertEqual(repr(p), "TypeParameter(prog.type('void'))")

        p = TypeParameter(lambda: None)
        self.assertRaises(TypeError, repr, p)
예제 #5
0
    def test_init(self):
        p = TypeParameter(self.prog.void_type())
        self.assertIdentical(p.type, self.prog.void_type())
        self.assertIsNone(p.name)

        p = TypeParameter(self.prog.void_type(), "foo")
        self.assertIdentical(p.type, self.prog.void_type())
        self.assertEqual(p.name, "foo")

        self.assertRaises(TypeError, TypeParameter, None)
        self.assertRaises(TypeError, TypeParameter, self.prog.void_type(), 1)
예제 #6
0
 def test_different_programs_function_parameter_callback(self):
     with self.assertRaisesRegex(ValueError,
                                 "type is from different program"):
         self.prog.function_type(
             self.prog.void_type(),
             (TypeParameter(lambda: Program().int_type("int", 4, True)), ),
         ).parameters[0].type
예제 #7
0
 def test_pointer_to_variadic_function(self):
     i = int_type("int", 4, True)
     self.assertTypeName(
         pointer_type(8, function_type(i, (TypeParameter(i), ), True)),
         "int (*)(int, ...)",
         True,
     )
예제 #8
0
파일: test_type.py 프로젝트: zeta1999/drgn
 def test_cmp(self):
     self.assertEqual(TypeParameter(void_type()),
                      TypeParameter(void_type(), None))
     self.assertEqual(TypeParameter(name="foo", type=void_type),
                      TypeParameter(void_type(), "foo"))
     self.assertNotEqual(TypeParameter(int_type("int", 4, True)),
                         TypeParameter(void_type(), None))
     self.assertNotEqual(TypeParameter(void_type(), "foo"),
                         TypeParameter(void_type(), None))
예제 #9
0
    def test_init(self):
        p = TypeParameter(self.prog.void_type())
        self.assertIdentical(p.default_argument,
                             Object(self.prog, self.prog.void_type()))
        self.assertIdentical(p.type, self.prog.void_type())
        self.assertIsNone(p.name)

        p = TypeParameter(
            Object(self.prog, self.prog.int_type("int", 4, True), 5), "foo")
        self.assertIdentical(
            p.default_argument,
            Object(self.prog, self.prog.int_type("int", 4, True), 5))
        self.assertIdentical(p.type, self.prog.int_type("int", 4, True))
        self.assertEqual(p.name, "foo")

        self.assertRaises(TypeError, TypeParameter, None)
        self.assertRaises(TypeError, TypeParameter, self.prog.void_type(), 1)
예제 #10
0
 def test_different_programs_function_parameter(self):
     self.assertRaisesRegex(
         ValueError,
         "object is from different program",
         self.prog.function_type,
         self.prog.void_type(),
         (TypeParameter(mock_program().int_type("int", 4, True)), ),
     )
예제 #11
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, (TypeParameter(i),), False))
         ),
         "int (*[4])(int)",
         True,
     )
예제 #12
0
    def test_function(self):
        t = self.prog.function_type(
            self.prog.void_type(),
            (TypeParameter(self.prog.int_type("int", 4, True), "n"), ),
        )
        self.assertEqual(t.kind, TypeKind.FUNCTION)
        self.assertIsNone(t.primitive)
        self.assertEqual(t.language, DEFAULT_LANGUAGE)
        self.assertIdentical(t.type, self.prog.void_type())
        self.assertIdentical(
            t.parameters,
            (TypeParameter(self.prog.int_type("int", 4, True), "n"), ))
        self.assertFalse(t.is_variadic)
        self.assertTrue(t.is_complete())

        self.assertEqual(
            repr(t),
            "prog.function_type(type=prog.void_type(), parameters=(TypeParameter(prog.type('int'), name='n'),), is_variadic=False)",
        )
        self.assertRaises(TypeError, sizeof, t)

        self.assertFalse(
            self.prog.function_type(self.prog.void_type(), (),
                                    False).is_variadic)
        self.assertTrue(
            self.prog.function_type(self.prog.void_type(), (),
                                    True).is_variadic)

        self.assertRaisesRegex(TypeError, r"must be _drgn\.Type",
                               self.prog.function_type, None, ())
        self.assertRaisesRegex(
            TypeError,
            "must be sequence",
            self.prog.function_type,
            self.prog.void_type(),
            None,
        )
        self.assertRaisesRegex(
            TypeError,
            "must be TypeParameter",
            self.prog.function_type,
            self.prog.void_type(),
            (4, ),
        )
예제 #13
0
 def test_pointer_to_function_returning_pointer(self):
     i = int_type("int", 4, True)
     self.assertTypeName(
         pointer_type(
             8,
             function_type(pointer_type(8, i), (TypeParameter(i), ),
                           False)),
         "int *(*)(int)",
         True,
     )
     self.assertTypeName(
         pointer_type(
             8,
             function_type(pointer_type(8, i),
                           (TypeParameter(pointer_type(8, i)), ), False),
         ),
         "int *(*)(int *)",
         True,
     )
예제 #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,
     )
예제 #15
0
 def test_const_pointer_to_function_returning_pointer(self):
     i = int_type("int", 4, True)
     self.assertTypeName(
         pointer_type(
             8,
             function_type(pointer_type(8, i), (TypeParameter(i), ), False),
             Qualifiers.CONST,
         ),
         "int *(* const)(int)",
         True,
     )
예제 #16
0
 def test_array_of_const_pointers_to_functions(self):
     i = self.prog.int_type("int", 4, True)
     self.assertTypeName(
         self.prog.array_type(
             self.prog.pointer_type(
                 self.prog.function_type(i, (TypeParameter(i),), False),
                 qualifiers=Qualifiers.CONST,
             ),
         ),
         "int (* const [])(int)",
         True,
     )
예제 #17
0
 def test_pointer_to_function_returning_const_pointer(self):
     i = self.prog.int_type("int", 4, True)
     self.assertTypeName(
         self.prog.pointer_type(
             self.prog.function_type(
                 self.prog.pointer_type(i, qualifiers=Qualifiers.CONST),
                 (TypeParameter(i),),
                 False,
             ),
         ),
         "int * const (*)(int)",
         True,
     )
예제 #18
0
파일: test_type.py 프로젝트: zeta1999/drgn
    def test_function(self):
        t = function_type(void_type(),
                          (TypeParameter(int_type("int", 4, True), "n"), ))
        self.assertEqual(t.kind, TypeKind.FUNCTION)
        self.assertIsNone(t.primitive)
        self.assertEqual(t.language, DEFAULT_LANGUAGE)
        self.assertEqual(t.type, void_type())
        self.assertEqual(t.parameters,
                         (TypeParameter(int_type("int", 4, True), "n"), ))
        self.assertFalse(t.is_variadic)
        self.assertTrue(t.is_complete())

        self.assertEqual(
            t,
            function_type(void_type(),
                          (TypeParameter(int_type("int", 4, True), "n"), )),
        )
        # Different return type.
        self.assertNotEqual(
            t,
            function_type(
                int_type("int", 4, True),
                (TypeParameter(int_type("int", 4, True), "n"), ),
            ),
        )
        # Different parameter name.
        self.assertNotEqual(
            t,
            function_type(void_type(),
                          (TypeParameter(int_type("int", 4, True), "x"), )),
        )
        # Unnamed parameter.
        self.assertNotEqual(
            t,
            function_type(void_type(),
                          (TypeParameter(int_type("int", 4, True), ), )))
        # Different number of parameters.
        self.assertNotEqual(
            t,
            function_type(
                void_type(),
                (
                    TypeParameter(int_type("int", 4, True), "n"),
                    TypeParameter(pointer_type(8, void_type()), "p"),
                ),
            ),
        )
        # One is variadic.
        self.assertNotEqual(
            t,
            function_type(void_type(),
                          (TypeParameter(int_type("int", 4, True), "n"), ),
                          True),
        )

        self.assertEqual(
            repr(t),
            "function_type(type=void_type(), parameters=(TypeParameter(type=int_type(name='int', size=4, is_signed=True), name='n'),), is_variadic=False)",
        )
        self.assertRaises(TypeError, sizeof, t)

        self.assertFalse(function_type(void_type(), (), False).is_variadic)
        self.assertTrue(function_type(void_type(), (), True).is_variadic)

        self.assertRaisesRegex(TypeError, "must be Type", function_type, None,
                               ())
        self.assertRaisesRegex(TypeError, "must be sequence", function_type,
                               void_type(), None)
        self.assertRaisesRegex(TypeError, "must be TypeParameter",
                               function_type, void_type(), (4, ))