Source code for meta.bytecodetools.instruction

'''
Created on May 10, 2012

@author: sean
'''


import opcode
import sys

py3 = sys.version_info.major >= 3
co_ord = (lambda c:c) if py3 else ord


[docs]class Instruction(object): ''' A Python byte-code instruction. ''' def __init__(self, i= -1, op=None, lineno=None): self.i = i self.op = op self.lineno = lineno self.oparg = None self.arg = None self.extended_arg = 0 self.linestart = False @property def opname(self): return opcode.opname[self.op] @property def to(self): if self.op in opcode.hasjrel: return self.arg elif self.op in opcode.hasjabs: return self.oparg else: raise Exception("this is not a jump op (%s)" % (self.opname,)) def __repr__(self): res = '<%s(%i)' % (opcode.opname[self.op], self.i,) if self.arg is not None: res += ' arg=%r' % (self.arg,) elif self.oparg is not None: res += ' oparg=%r' % (self.oparg,) return res + '>' def __str__(self): result = [] if self.linestart: result.append("%3d" % self.lineno) else: result.append(" ") if self.lasti: result.append('-->') else: result.append(' ') if self.label: result.append('>>') else: result.append(' ') result.append(repr(self.i).rjust(4)) result.append(opcode.opname[self.op].ljust(20)) if self.op >= opcode.HAVE_ARGUMENT: result.append(repr(self.oparg).rjust(5)) if self.op in opcode.hasconst: result.append('(' + repr(self.arg) + ')') elif self.op in opcode.hasname: result.append('(' + repr(self.arg) + ')') elif self.op in opcode.hasjrel: result.append('(to ' + repr(self.arg) + ')') elif self.op in opcode.haslocal: result.append('(' + repr(self.arg) + ')') elif self.op in opcode.hascompare: result.append('(' + repr(self.arg) + ')') elif self.op in opcode.hasfree: result.append('(' + repr(self.arg) + ')') return ' '.join(result)