Exemple #1
0
 def testOneItemInParent(self):
     parent = SymbolTable()
     st = SymbolTable(parent)
     parent.add('x', self.x, None)
     self.assertEquals(st.get_names(), set())
     self.assertEquals(st.get_all_names(), set(['x']))
     self.assertEquals(st.lookup('x'), self.x)
Exemple #2
0
 def testConflict(self):
     st = SymbolTable()
     errors = Errors()
     st.add('x', self.x, errors)
     st.add('x', self.x2, errors)
     self.assertEquals(errors.num_errors, 1)
     self.assertEquals(st.get_names(), set(['x']))
     self.assertEquals(st.lookup('x'), self.x)
Exemple #3
0
 def testSymbolTableWithVar(self):
     decl = VariableDecl(int_type, 'x')
     blk = Block([decl])
     func = FunctionDecl(int_type, 'f', [], blk)
     blk.symbol_table = SymbolTable()
     blk.symbol_table.add('x', decl, None)
     self.assertSuccess(func)
     st = func.cfg.symbol_table
     self.assertEqual(st.get_names(), set(['x']))
Exemple #4
0
    def visit_FunctionDecl(self, func):
        cfg = CFG(func.name)
        func.cfg = cfg

        if hasattr(func, 'symbol_table'):
            cfg.symbol_table = SymbolTable(func.symbol_table.parent)
            cfg.symbol_table.embed(func.symbol_table)
        else:
            cfg.symbol_table = SymbolTable()

        prev_node = self.visit(func.body,
                               cfg=cfg,
                               entry=cfg.entry,
                               exit=cfg.exit,
                               break_target=None)
        if prev_node is not None:
            cfg.connect(prev_node, cfg.exit)

        cfg.remove_pass_nodes()
Exemple #5
0
 def testOut(self):
     function = FunctionDecl(void_type, 'f', [], Block([]))
     cfg = CFG('f')
     n5 = Numeral(5)
     n5.type = int_type
     n1 = Numeral(1)
     n1.type = int_type
     stmt = Operation(FunctionCall(Name('__out__'), [n5, n1]))
     cfg.connect(cfg.entry, stmt, cfg.exit)
     function.cfg = cfg
     function.symbol_table = SymbolTable()
     cfg.symbol_table = SymbolTable(function.symbol_table)
     program = Program([function])
     self.assertSuccess(program)
     self.assertTrue(function.cfg.has_path(function.cfg.entry,
         Operation(AssignStatement(Name('$t0'), Numeral(5))),
         Operation(AssignStatement(Name('$t1'), Numeral(1))),
         Operation(FunctionCall(Name('__out__'), [Name('$t0'), Name('$t1')])),
         function.cfg.exit))
Exemple #6
0
 def testShadow(self):
     parent = SymbolTable()
     parent.add('x', self.x, None)
     st = SymbolTable(parent)
     errors = Errors()
     st.add('x', self.x2, errors)
     self.assertEquals(errors.num_warnings, 1)
     self.assertEquals(st.get_names(), set(['x']))
     self.assertEquals(st.get_all_names(), set(['x']))
     self.assertEquals(st.lookup('x'), self.x2)
Exemple #7
0
 def testEmptyWithParent(self):
     parent = SymbolTable()
     st = SymbolTable(parent)
     self.assertEquals(st.get_names(), set())
     self.assertEquals(st.get_all_names(), set())
     self.assertEquals(st.parent, parent)
Exemple #8
0
 def testEmpty(self):
     st = SymbolTable()
     self.assertEquals(st.get_names(), set())
     self.assertEquals(st.get_all_names(), set())
     self.assertIsNone(st.parent)