control_flow_instructions.py 文件源码

python
阅读 21 收藏 0 点赞 0 评论 0

项目:femtocode 作者: diana-hep 项目源码 文件源码
def make_list_comp(self, get_iter, for_iter):

        block = self.make_block(for_iter.to, inclusive=False, raise_=False)

        jump_abs = block.pop()

        assert jump_abs.opname == 'JUMP_ABSOLUTE', jump_abs.opname
        jump_map = {for_iter.i:for_iter.to}

        stmnts = self.decompile_block(block, stack_items=[None], jump_map=jump_map).stmnt()

        if len(stmnts) > 1:

            assign = stmnts.pop(0)

            assert len(stmnts) == 1

            assert isinstance(assign, _ast.Assign)

            list_expr = self.ast_stack.pop()

            # empty ast.List object
            list_ = self.ast_stack.pop()

            ifs = []
            elt = refactor_ifs(stmnts[0], ifs)

            assert len(assign.targets) == 1
            generators = [_ast.comprehension(target=assign.targets[0], iter=list_expr, ifs=ifs, lineno=get_iter.lineno, col_offset=0)]

            if isinstance(list_, _ast.Assign):

                comp = _ast.comprehension(target=list_.targets[0], iter=None, ifs=ifs, lineno=get_iter.lineno, col_offset=0)
                generators.insert(0, comp)

            list_comp = _ast.ListComp(elt=elt, generators=generators, lineno=get_iter.lineno, col_offset=0)
        else:
            list_expr = self.ast_stack.pop()
            list_comp = stmnts[0]

            generators = list_comp.generators

            # empty ast.List object
            list_ = self.ast_stack.pop()
            if not isinstance(list_, _ast.Assign):
                comp = _ast.comprehension(target=list_.targets[0], iter=None, ifs=[], lineno=get_iter.lineno, col_offset=0)
                generators.insert(0, comp)

            generators[0].iter = list_expr

        self.ast_stack.append(list_comp)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号