def test_smoke(self): ctx = Py27EmitterContext().emit_fragment(Return(Add(Load(0), Load(1)))) self.assertEqual( ctx.last_builder.buf.tolist(), [124, 0, 0, 124, 1, 0, 23, 83]) self.assertEqual( ctx.last_builder.stack_changes, [dec_inc(-0, +1), dec_inc(-0, +1), dec_inc(-2, +1), dec_inc(-1, 0)]) self.assertEqual(ctx.last_builder.stack_usage(), (0, 0, 2)) self.assertTrue(ctx.last_builder.is_valid_stack(), True)
def test_textbook_example(self): def fn(z): x = 3 + 6 y = x - 5 return z * y ctx = unemit(fn.__code__, Py27Op) self.assertEqual(ctx.ops, [ Store("x", Const(9)), Store("y", Subtract(Load("x"), Const(5))), Return(Multiply(Load('z'), Load('y')))]) # NOTE: this doesn't work yet but the goal is to make it work :) ctx = unemit(fn.__code__, Py27Op)
def test_it_really_works(self): ctx = Py27EmitterContext().emit( Function(('a', 'b'), "add two things together", Return(Add(Load('a'), Load('b'))))) code = ctx.make_code(ctx.last_builder, name="add") globals = {} name = None argdefs = () closure = () # function(code, globals[, name[, argdefs[, closure]]]) add = types.FunctionType(code, globals, name, argdefs, closure) # Now see if it really works self.assertEqual(add(1, 2), 3) self.assertEqual(add("hello", " world"), "hello world") self.assertEqual(add(['foo'], ['bar']), ['foo', 'bar'])
def test_Load(self): ctx = Py27EmitterContext().emit_fragment(Load(0xAABB)) self.assertEqual(ctx.last_builder.buf.tolist(), [124, 0xBB, 0xAA]) self.assertEqual(ctx.last_builder.stack_usage(), (0, 1, 1)) self.assertFalse(ctx.last_builder.is_valid_stack())
def test_unemit_Load_Load_Multiplu_Return(self): fn = lambda a, b: a * b ctx = unemit(fn.__code__, Py27Op) self.assertEqual(ctx.retval, Return(Multiply(Load('a'), Load('b'))))
def test_unemit_Load_Load_Subtract_Return(self): fn = lambda a, b: a - b ctx = unemit(fn.__code__, Py27Op) self.assertEqual(ctx.retval, Return(Subtract(Load('a'), Load('b'))))
def test_unemit_Load_Load_Add_Return(self): fn = lambda a, b: a + b ctx = unemit(fn.__code__, Py27Op) self.assertEqual(ctx.retval, Return(Add(Load('a'), Load('b'))))
def test_unemit_Load_Return(self): fn = lambda x: x ctx = unemit(fn.__code__, Py27Op) self.assertEqual(ctx.retval, Return(Load('x')))
def test_Multiply_sanity(self): self.assertPerfectCode( lambda a, b: a * b, Function(('a', 'b'), None, Return(Multiply(Load("a"), Load("b")))))
def test_Subtract_sanity(self): self.assertPerfectCode( lambda a, b: a - b, Function(('a', 'b'), None, Return(Subtract(Load("a"), Load("b")))))
def test_Add_sanity(self): self.assertPerfectCode( lambda a, b: a + b, Function(('a', 'b'), None, Return(Add(Load("a"), Load("b")))))
def test_Neg_sanity(self): self.assertPerfectCode( lambda a: -a, Function(('a',), None, Return(Neg(Load("a")))))