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)
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)
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)
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']))
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()
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))
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)
def testEmpty(self): st = SymbolTable() self.assertEquals(st.get_names(), set()) self.assertEquals(st.get_all_names(), set()) self.assertIsNone(st.parent)