def check_dump_bytecode(self, code, expected, lineno=None): with contextlib.redirect_stdout(io.StringIO()) as stderr: if lineno is not None: bytecode.dump_bytecode(code, lineno=True) else: bytecode.dump_bytecode(code) output = stderr.getvalue() self.assertEqual(output, expected)
def write_bytecode(self, b, op_number=None, prefix=''): filename, op_number = self._get_filename(op_number, prefix) with open(filename, 'w') as stream: bytecode.dump_bytecode(b, stream=stream, lineno=True) return op_number
def f(a, b): # res = a + b return def g(a, b): res = a + b if a < b else b + a r = 0 for a in range(res): r += 1 return r or 2 for x in (f, g): #get byte code for f dis(x) print(f.__code__.co_code) c = Bytecode.from_code(x.__code__) cc = ConcreteBytecode.from_code(x.__code__) dump_bytecode(c) dump_bytecode(cc) #generate byte code cnew = c.to_code() x.__code__ = cnew dis(x) print(x(3, 5))
def test_type_validation(self): class T: first_lineno = 1 with self.assertRaises(TypeError): bytecode.dump_bytecode(T())