Example #1
0
 def test_block_partition_call_flag(self):
     code = """
     nop
     call z, __UNKNOWN
     nop
     """
     self.blk.code = [x for x in code.split('\n') if x.strip()]
     blks = basicblock.get_basic_blocks(self.blk)
     self.assertEqual(len(blks), 2)
     self.assertEqual(blks[0].code, ['nop', 'call z, __UNKNOWN'])
     self.assertEqual(blks[1].code, ['nop'])
     self.assertTrue(blks[1] in blks[0].goes_to)
     self.assertTrue(blks[0] in blks[1].comes_from)
Example #2
0
 def test_call_part(self):
     code = """
     my_block:
     ld a, 3
     ret
     ld a, 1
     call my_block
     ld a, 2
     """
     self.blk.code = [x for x in code.split('\n') if x.strip()]
     optimizer.initialize_memory(self.blk)
     blks = basicblock.get_basic_blocks(self.blk)
     self.assertEqual(len(blks), 3)
     self.assertEqual(blks[0].code, ['my_block:', 'ld a, 3', 'ret'])
     self.assertEqual(blks[1].code, ['ld a, 1', 'call my_block'])
     self.assertEqual(blks[2].code, ['ld a, 2'])
     self.assertTrue(blks[1] in blks[0].comes_from)
     self.assertTrue(blks[0] in blks[1].goes_to)
     self.assertTrue(blks[0] in blks[2].comes_from)
     self.assertTrue(blks[2] in blks[0].goes_to)
Example #3
0
    def test_long_block(self):
        code = """
        ld a, 0
        jp __LABEL2
    __LABEL0:
        ld a, 1
        jp z, __LABEL1
        ld a, 2
    __LABEL1:
        ld a, 3
    __LABEL2:
        ld a, 4
        jp nc, __LABEL0
        ld a, 5
        """
        self.blk.code = [x for x in code.split('\n') if x.strip()]
        optimizer.initialize_memory(self.blk)
        blks = basicblock.get_basic_blocks(self.blk)
        self.assertEqual(len(blks), 6)
        self.assertEqual(blks[0].code, ['ld a, 0', 'jp __LABEL2'])
        self.assertEqual(blks[1].code,
                         ['__LABEL0:', 'ld a, 1', 'jp z, __LABEL1'])
        self.assertEqual(blks[2].code, ['ld a, 2'])
        self.assertEqual(blks[3].code, ['__LABEL1:', 'ld a, 3'])
        self.assertEqual(blks[4].code,
                         ['__LABEL2:', 'ld a, 4', 'jp nc, __LABEL0'])
        self.assertEqual(blks[5].code, ['ld a, 5'])

        self.assertTrue(blks[4] in blks[0].goes_to)
        self.assertTrue(blks[4] in blks[1].comes_from)
        self.assertTrue(blks[1] in blks[4].goes_to)
        self.assertTrue(blks[4] in blks[3].goes_to)
        self.assertTrue(blks[5] in blks[4].goes_to)

        self.assertFalse(blks[1] in blks[2].goes_to)
        self.assertFalse(blks[1] in blks[3].goes_to)
        self.assertFalse(blks[5].goes_to)  # empty