def POP_JUMP_IF_FALSE(self, instr): #print("POP_JUMP_IF_FALSE") left = self.ast_stack.pop() and_block = self.gather_jumps(instr) #This is an IF statement if and_block[-1].opname in ['JUMP_FORWARD', 'JUMP_ABSOLUTE', 'RETURN_VALUE']: #this happens if the function was going to return anyway if and_block[-1].opname == 'RETURN_VALUE': JUMP_FORWARD = Instruction(and_block[-1].i, 110, lineno=0) JUMP_FORWARD.arg = instr.to and_block.append(JUMP_FORWARD) #print() #print("make_if", instr, left, and_block) #print() self.make_if(instr, left, and_block) return else: #This is an expression hi = self.process_logic([instr] + and_block) ast_ = self.logic_ast(instr, left, hi) self.ast_stack.append(ast_)
def POP_JUMP_IF_FALSE(self, instr): #print("POP_JUMP_IF_FALSE") left = self.ast_stack.pop() and_block = self.gather_jumps(instr) #This is an IF statement if and_block[-1].opname in [ 'JUMP_FORWARD', 'JUMP_ABSOLUTE', 'RETURN_VALUE' ]: #this happens if the function was going to return anyway if and_block[-1].opname == 'RETURN_VALUE': JUMP_FORWARD = Instruction(and_block[-1].i, 110, lineno=0) JUMP_FORWARD.arg = instr.to and_block.append(JUMP_FORWARD) #print() #print("make_if", instr, left, and_block) #print() self.make_if(instr, left, and_block) return else: #This is an expression hi = self.process_logic([instr] + and_block) ast_ = self.logic_ast(instr, left, hi) self.ast_stack.append(ast_)
def disassembler(co, lasti= -1): """Disassemble a code object. :param co: code object :param lasti: internal :yields: Instructions. """ code = co.co_code labels = findlabels(code) linestarts = dict(findlinestarts(co)) n = len(code) i = 0 extended_arg = 0 lineno = 0 free = None while i < n: c = code[i] op = co_ord(c) if i in linestarts: lineno = linestarts[i] instr = Instruction(i=i, op=op, lineno=lineno) instr.linestart = i in linestarts if i == lasti: instr.lasti = True else: instr.lasti = False if i in labels: instr.label = True else: instr.label = False i = i + 1 if op >= opcode.HAVE_ARGUMENT: oparg = co_ord(code[i]) + co_ord(code[i + 1]) * 256 + extended_arg instr.oparg = oparg extended_arg = 0 i = i + 2 if op == opcode.EXTENDED_ARG: extended_arg = oparg * 65536 instr.extended_arg = extended_arg if op in opcode.hasconst: instr.arg = co.co_consts[oparg] elif op in opcode.hasname: instr.arg = co.co_names[oparg] elif op in opcode.hasjrel: instr.arg = i + oparg elif op in opcode.haslocal: instr.arg = co.co_varnames[oparg] elif op in opcode.hascompare: instr.arg = opcode.cmp_op[oparg] elif op in opcode.hasfree: if free is None: free = co.co_cellvars + co.co_freevars instr.arg = free[oparg] yield instr