Author: Raffael Tfirst <raffael.tfi...@gmail.com> Branch: py3.5-async Changeset: r85715:15b50bccd6cd Date: 2016-07-14 23:13 +0200 http://bitbucket.org/pypy/pypy/changeset/15b50bccd6cd/
Log: Create Coroutine class in generator with typedef (unfinished) diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py --- a/pypy/interpreter/generator.py +++ b/pypy/interpreter/generator.py @@ -304,6 +304,31 @@ block = block.previous +class Coroutine(W_Root): + "A coroutine object." + _immutable_fields_ = ['pycode'] + + def __init__(self, frame): + self.space = frame.space + self.frame = frame # turned into None when frame_finished_execution + self.pycode = frame.pycode + self.running = False + if self.pycode.co_flags & CO_YIELD_INSIDE_TRY: + self.register_finalizer(self.space) + + def descr__repr__(self, space): + if self.pycode is None: + code_name = '<finished>' + else: + code_name = self.pycode.co_name + addrstring = self.getaddrstring(space) + return space.wrap("<coroutine object %s at 0x%s>" % + (code_name, addrstring)) + + #def close + #w_close = space.getattr(w_yf, space.wrap("close")) + + def get_printable_location_genentry(bytecode): return '%s <generator>' % (bytecode.get_repr(),) generatorentry_driver = jit.JitDriver(greens=['pycode'], diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -1418,6 +1418,8 @@ def GET_YIELD_FROM_ITER(self, oparg, next_instr): w_iterable = self.popvalue() w_iterator = self.space.iter(w_iterable) + #ec = space.getexecutioncontext() + #flags = ec.compiler.getcodeflags(self.pycode) self.pushvalue(w_iterator) def GET_AWAITABLE(self, oparg, next_instr): diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -466,7 +466,7 @@ from pypy.interpreter.function import (Function, Method, StaticMethod, ClassMethod, BuiltinFunction, descr_function_get) from pypy.interpreter.pytraceback import PyTraceback -from pypy.interpreter.generator import GeneratorIterator +from pypy.interpreter.generator import GeneratorIterator, Coroutine from pypy.interpreter.nestedscope import Cell from pypy.interpreter.special import NotImplemented, Ellipsis @@ -797,6 +797,28 @@ ) assert not GeneratorIterator.typedef.acceptable_as_base_class # no __new__ +Coroutine.typedef = TypeDef("coroutine", + __repr__ = interp2app(GeneratorIterator.descr__repr__), + __reduce__ = interp2app(GeneratorIterator.descr__reduce__), + __setstate__ = interp2app(GeneratorIterator.descr__setstate__), + __next__ = interp2app(GeneratorIterator.descr_next, + descrmismatch='__next__'), + send = interp2app(GeneratorIterator.descr_send, + descrmismatch='send'), + throw = interp2app(GeneratorIterator.descr_throw, + descrmismatch='throw'), + close = interp2app(GeneratorIterator.descr_close, + descrmismatch='close'), + __iter__ = interp2app(GeneratorIterator.descr__iter__, + descrmismatch='__iter__'), + gi_running = interp_attrproperty('running', cls=GeneratorIterator), + gi_frame = GetSetProperty(GeneratorIterator.descr_gi_frame), + gi_code = GetSetProperty(GeneratorIterator.descr_gi_code), + __name__ = GetSetProperty(GeneratorIterator.descr__name__), + __weakref__ = make_weakref_descr(GeneratorIterator), +) +assert not Coroutine.typedef.acceptable_as_base_class # no __new__ + Cell.typedef = TypeDef("cell", __total_ordering__ = 'auto', __lt__ = interp2app(Cell.descr__lt__), _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit