def test_nested_code_objects(self): mod = """ def f(): return 1 f()""" data = serialize(compile(mod, "spli", "exec")) spli_code = deserialize(data) assert len(spli_code.co_consts_w) == 2 assert isinstance(spli_code.co_consts_w[0], pycode.Code) assert spli_code.co_consts_w[0].co_consts_w[0] is objects.spli_None assert spli_code.co_consts_w[0].co_consts_w[1].as_int() == 1
def test_basic(self): def f(): return 1 coderepr = serialize(f.func_code) code = deserialize(coderepr) assert code.co_nlocals == f.func_code.co_nlocals assert code.co_argcount == 0 assert code.co_stacksize == f.func_code.co_stacksize assert code.co_names == [] assert self.eval(code).value == 1
def test_one(self): def f(a, b): return a + b data = serialize(f.func_code) space = objects.DumbObjSpace() def run(a, b): co = deserialize(data) args = [] args.append(space.wrap(a)) args.append(space.wrap(b)) w_res = execution.run(co, args) assert isinstance(w_res, objects.Int) return w_res.value assert run(2, 3) == 5 res = interpret(run, [2, 3]) assert res == 5
def interpret(self, f, args): coderepr = serializer.serialize(f.func_code) arg_params = ", ".join(['arg%d' % i for i in range(len(args))]) arg_ass = ";".join(['frame.locals[%d] = space.wrap(arg%d)' % (i, i) for i in range(len(args))]) space = objects.DumbObjSpace() source = py.code.Source(""" def bootstrap(%(arg_params)s): co = serializer.deserialize(coderepr) frame = interpreter.SPLIFrame(co) %(arg_ass)s return frame.run() """ % locals()) d = globals().copy() d['coderepr'] = coderepr d['space'] = space exec source.compile() in d return self.meta_interp(d['bootstrap'], args, listops=True)
def interpret(self, f, args): coderepr = serializer.serialize(f.func_code) arg_params = ", ".join(['arg%d' % i for i in range(len(args))]) arg_ass = ";".join([ 'frame.locals[%d] = space.wrap(arg%d)' % (i, i) for i in range(len(args)) ]) space = objects.DumbObjSpace() source = py.code.Source(""" def bootstrap(%(arg_params)s): co = serializer.deserialize(coderepr) frame = interpreter.SPLIFrame(co) %(arg_ass)s return frame.run() """ % locals()) d = globals().copy() d['coderepr'] = coderepr d['space'] = space exec source.compile() in d return self.meta_interp(d['bootstrap'], args, listops=True)