def test_Sub(self): ctx = Py27EmitterContext().emit_fragment(Subtract()) # XXX: this should not be allowed in practice self.assertEqual(ctx.last_builder.buf.tolist(), [24]) self.assertEqual(ctx.last_builder.stack_changes, [dec_inc(-2, +1)]) self.assertEqual(ctx.last_builder.stack_usage(), (-2, -1, 0)) self.assertFalse(ctx.last_builder.is_valid_stack())
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 assertPerfectCode(self, fn, *nodes): ctx = Py27EmitterContext().emit(Flags(FLAG_NESTED), *nodes) orig = fn.__code__ # Useful for readability on failure self.assertEqual( [ord(c) for c in orig.co_code], ctx.last_builder.buf.tolist()) made = ctx.make_code( ctx.last_builder, name=fn.__name__, filename=fn.__code__.co_filename, firstlineno=fn.__code__.co_firstlineno) # Useful for readability on non-trivial failure self.assertEqual(code_props(orig), code_props(made)) # Actual correctness check self.assertEqual(orig, made)
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_Return(self): ctx = Py27EmitterContext().emit_fragment(Return()) self.assertEqual(ctx.last_builder.buf.tolist(), [83]) self.assertEqual(ctx.last_builder.stack_changes, [dec_inc(-1, +0)]) self.assertEqual(ctx.last_builder.stack_usage(), (-1, -1, 0)) self.assertFalse(ctx.last_builder.is_valid_stack())
def test_Store(self): ctx = Py27EmitterContext().emit_fragment(Store(0xAABB)) self.assertEqual(ctx.last_builder.buf.tolist(), [125, 0xBB, 0xAA]) self.assertEqual(ctx.last_builder.stack_usage(), (-1, -1, 0)) self.assertFalse(ctx.last_builder.is_valid_stack())
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_Const(self): ctx = Py27EmitterContext().emit_fragment(Const("hi")) self.assertEqual(ctx.last_builder.buf.tolist(), [100, 1, 0]) self.assertEqual(ctx.last_builder.stack_usage(), (0, 1, 1)) self.assertFalse(ctx.last_builder.is_valid_stack())
def test_Neg(self): ctx = Py27EmitterContext().emit_fragment(Neg()) self.assertEqual(ctx.last_builder.buf.tolist(), [11]) self.assertEqual(ctx.last_builder.stack_usage(), (-1, 0, 0)) self.assertFalse(ctx.last_builder.is_valid_stack())
def et(t): return Py27EmitterContext().emit_fragment(t).buf.tolist()
def en(n): return Py27EmitterContext().emit_fragment([n]).buf.tolist()