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

Reply via email to