Author: Raffael Tfirst <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit