def testSplitVariablesGCD(self, group_variables_mock):
     group = {'a': [([-1], [0])],
              'b': [([-2], [1])],
              'c': [([0, 6], [2, 5, 6, 7, 8])],
              'd': [([1], [3, 4, 5, 6, 7])],
              'ret': [([3, 8], [9])]}
     group_variables_mock.return_value = group
     dataflow.split_variables(
         mock.sentinel, [0, 1, 2, 3, 4], mock.sentinel, mock.sentinel)
Example #2
0
    def testSplitVariablesIfBool(self, group_variables_mock):
        group = {
            0: [([0], [5, 7]), ([4, 5, 7], [8])],
            1: [([6], [7])],
            2: [([-1], [1, 6])],
            3: [([-2], [2, 3])]
        }
        group_variables_mock.return_value = group
        param1_mock = mock.Mock()
        param2_mock = mock.Mock()
        var0_mock = mock.Mock()
        var1_mock = mock.Mock()
        lvars = {0: var0_mock, 1: var1_mock, 2: param1_mock, 3: param2_mock}
        du = {
            (0, 0): [7, 5],
            (0, 4): [8],
            (0, 5): [8],
            (0, 7): [8],
            (1, 6): [7],
            (2, -1): [6, 1],
            (3, -2): [2, 3]
        }
        ud = {
            (0, 5): [0],
            (0, 7): [0],
            (0, 8): [4, 5, 7],
            (1, 7): [6],
            (2, 1): [-1],
            (2, 6): [-1],
            (3, 2): [-2],
            (3, 3): [-2]
        }
        graph_mock = mock.Mock()
        dataflow.split_variables(graph_mock, lvars, du, ud)

        expected_du = {
            (1, 6): [7],
            (2, -1): [6, 1],
            (3, -2): [2, 3],
            (4, 0): [7, 5],
            (5, 4): [8],
            (5, 5): [8],
            (5, 7): [8]
        }
        expected_ud = {
            (1, 7): [6],
            (2, 1): [-1],
            (2, 6): [-1],
            (3, 2): [-2],
            (3, 3): [-2],
            (4, 5): [0],
            (4, 7): [0],
            (5, 8): [4, 5, 7]
        }
        self.assertEqual(du, expected_du)
        self.assertEqual(ud, expected_ud)
Example #3
0
 def testSplitVariablesGCD(self, group_variables_mock):
     group = {
         'a': [([-1], [0])],
         'b': [([-2], [1])],
         'c': [([0, 6], [2, 5, 6, 7, 8])],
         'd': [([1], [3, 4, 5, 6, 7])],
         'ret': [([3, 8], [9])]
     }
     group_variables_mock.return_value = group
     dataflow.split_variables(mock.sentinel, [0, 1, 2, 3, 4], mock.sentinel,
                              mock.sentinel)
Example #4
0
    def process(self, doAST=False):
        logger.debug('METHOD : %s', self.name)

        # Native methods... no blocks.
        if self.start_block is None:
            logger.debug('Native Method.')
            if doAST:
                self.ast = JSONWriter(None, self).get_ast()
            else:
                self.writer = Writer(None, self)
                self.writer.write_method()
            return

        graph = construct(self.start_block, self.var_to_name, self.exceptions)
        self.graph = graph

        if not __debug__:
            util.create_png(self.cls_name, self.name, graph, '/tmp/dad/blocks')

        use_defs, def_uses = build_def_use(graph, self.lparams)
        split_variables(graph, self.var_to_name, def_uses, use_defs)
        dead_code_elimination(graph, def_uses, use_defs)
        register_propagation(graph, def_uses, use_defs)

        place_declarations(graph, self.var_to_name, def_uses, use_defs)
        del def_uses, use_defs
        # After the DCE pass, some nodes may be empty, so we can simplify the
        # graph to delete these nodes.
        # We start by restructuring the graph by spliting the conditional nodes
        # into a pre-header and a header part.
        split_if_nodes(graph)
        # We then simplify the graph by merging multiple statement nodes into
        # a single statement node when possible. This also delete empty nodes.

        simplify(graph)
        graph.compute_rpo()

        if not __debug__:
            util.create_png(self.cls_name, self.name, graph,
                                                    '/tmp/dad/pre-structured')

        identify_structures(graph, graph.immediate_dominators())

        if not __debug__:
            util.create_png(self.cls_name, self.name, graph,
                                                    '/tmp/dad/structured')

        if doAST:
            self.ast = JSONWriter(graph, self).get_ast()
        else:
            self.writer = Writer(graph, self)
            self.writer.write_method()
    def testSplitVariablesIfBool(self, group_variables_mock):
        group = {0: [([0], [5, 7]), ([4, 5, 7], [8])],
                 1: [([6], [7])],
                 2: [([-1], [1, 6])],
                 3: [([-2], [2, 3])]}
        group_variables_mock.return_value = group
        param1_mock = mock.Mock()
        param2_mock = mock.Mock()
        var0_mock = mock.Mock()
        var1_mock = mock.Mock()
        lvars = {0: var0_mock, 1: var1_mock, 2: param1_mock, 3: param2_mock}
        du = {(0, 0): [7, 5],
              (0, 4): [8],
              (0, 5): [8],
              (0, 7): [8],
              (1, 6): [7],
              (2, -1): [6, 1],
              (3, -2): [2, 3]}
        ud = {(0, 5): [0],
              (0, 7): [0],
              (0, 8): [4, 5, 7],
              (1, 7): [6],
              (2, 1): [-1],
              (2, 6): [-1],
              (3, 2): [-2],
              (3, 3): [-2]}
        graph_mock = mock.Mock()
        dataflow.split_variables(graph_mock, lvars, du, ud)

        expected_du = {(1, 6): [7],
                       (2, -1): [6, 1],
                       (3, -2): [2, 3],
                       (4, 0): [7, 5],
                       (5, 4): [8],
                       (5, 5): [8],
                       (5, 7): [8]}
        expected_ud = {(1, 7): [6],
                       (2, 1): [-1],
                       (2, 6): [-1],
                       (3, 2): [-2],
                       (3, 3): [-2],
                       (4, 5): [0],
                       (4, 7): [0],
                       (5, 8): [4, 5, 7]}
        self.assertEqual(du, expected_du)
        self.assertEqual(ud, expected_ud)