File: test.py

package info (click to toggle)
llvm-py 0.5%2Bsvn85-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 996 kB
  • ctags: 1,768
  • sloc: python: 3,655; ansic: 1,893; cpp: 495; pascal: 91; makefile: 8; sh: 1
file content (134 lines) | stat: -rwxr-xr-x 3,840 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python

# watch out for uncollected objects
import gc

import unittest, sys

from llvm import *
from llvm.core import *

class TestModule(unittest.TestCase):

    def setUp(self):
        pass

    def testmodule_and_moduleprovider(self):
        """Ownership issues between Module and ModuleProvider objects."""

        def temp_mp(m):
            mp = ModuleProvider.new(m)
            del mp

        def temp_m():
            m = Module.new("temp_m")
            return ModuleProvider.new(m)

        # check basic ownership and deletion
        m = Module.new("test1.1")
        self.assertEqual(m.owner, None)
        mp = ModuleProvider.new(m)
        self.assertEqual(m.owner, mp)
        mp_repr = repr(mp)
        mp = None
        self.assertNotEqual(m.owner, None)
        self.assertEqual(repr(m.owner), mp_repr)
        m = None
        # This doesn't work. Looks like there are leaks elsewhere
        # too (unittest module?).
        #gc.collect()
        #self.assertEqual(gc.garbage, [])

        # delete a module which was owned by a module provider that has
        # gone out of scope
        m2 = Module.new("test1.2")
        temp_mp(m2)
        del m2
        #self.assertEqual(gc.garbage, [])

        # delete a module provider object which owned a module that has
        # gone out of scope
        mp3 = temp_m()
        mp3 = None

        # check ref counts
        m4 = Module.new("test1.4")
        self.assertEqual(sys.getrefcount(m4), 1+1)
        mp4 = ModuleProvider.new(m4)
        self.assertEqual(sys.getrefcount(m4), 1+1)
        self.assertEqual(sys.getrefcount(mp4), 2+1)
        m4 = None
        self.assertEqual(sys.getrefcount(mp4), 1+1)
        mp4 = None

        # cannot create a second module provider object for the same
        # module
        works = False
        m5 = Module.new("test1.5")
        mp5 = ModuleProvider.new(m5)
        try:
            mp5_2 = ModuleProvider.new(m5)
        except LLVMException:
            works = True
        self.assertEqual(works, True)


    def testdata_layout(self):
        """Data layout property."""
        m = Module.new("test2.1")
        self.assertEqual(m.data_layout, '')
        m.data_layout = 'some_value'
        self.assertEqual(m.data_layout, 'some_value')
        reqd = '; ModuleID = \'test2.1\'\ntarget datalayout = "some_value"\n'
        self.assertEqual(str(m), reqd)


    def testtarget(self):
        """Target property."""
        m = Module.new("test3.1")
        self.assertEqual(m.target, '')
        m.target = 'some_value'
        self.assertEqual(m.target, 'some_value')
        reqd = '; ModuleID = \'test3.1\'\ntarget triple = "some_value"\n'
        self.assertEqual(str(m), reqd)


    def testtype_name(self):
        """Type names."""
        m = Module.new("test4.1")
        r = m.add_type_name("typename41", Type.int())
        self.assertEqual(r, 0)
        r = m.add_type_name("typename41", Type.int())
        self.assertEqual(r, 1)
        reqd = "; ModuleID = 'test4.1'\n\n%typename41 = type i32\n"
        self.assertEqual(str(m), reqd)
        r = m.delete_type_name("typename41")
        reqd = "; ModuleID = 'test4.1'\n"
        self.assertEqual(str(m), reqd)
        r = m.delete_type_name("no such name") # nothing should happen
        reqd = "; ModuleID = 'test4.1'\n"
        self.assertEqual(str(m), reqd)


    def testglobal_variable(self):
        """Global variables."""
        m = Module.new("test5.1")
        t = Type.int()
        gv = m.add_global_variable(t, "gv")
        self.assertNotEqual(gv, None)
        self.assertEqual(gv.name, "gv")
        self.assertEqual(gv.type, Type.pointer(t))


def main():
    gc.set_debug(gc.DEBUG_LEAK)

    # run tests
    unittest.main()

    # done
    if gc.garbage:
        print "garbage = ", gc.garbage


main()