[pypy-commit] pypy py3.5-async: Only check flags if iterable object is a coroutine, split getawaitable for generator and coroutine
raffael_t
pypy.commits at gmail.com
Mon Jul 25 15:46:02 EDT 2016
Author: Raffael Tfirst <raffael.tfirst at gmail.com>
Branch: py3.5-async
Changeset: r85866:088b0533e388
Date: 2016-07-25 21:45 +0200
http://bitbucket.org/pypy/pypy/changeset/088b0533e388/
Log: Only check flags if iterable object is a coroutine, split
getawaitable for generator and coroutine
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -302,6 +302,10 @@
self.descr_close()
break
block = block.previous
+
+ def _GetAwaitableIter(self, o):
+ #look at typeobject.c, change to self.space.lookup(w_manager, "__await__")
+ return o
class Coroutine(W_Root):
@@ -568,10 +572,7 @@
block = block.previous
def _GetAwaitableIter(self, o):
- import pdb; pdb.set_trace()
- if isinstance(o, Coroutine):
- return o
- getter = None
+ return o
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1031,15 +1031,17 @@
def YIELD_FROM(self, oparg, next_instr):
from pypy.interpreter.astcompiler import consts
+ from pypy.interpreter.generator import Coroutine
space = self.space
w_value = self.popvalue()
w_gen = self.peekvalue()
- if (w_gen.descr_gi_code(w_gen).co_flags & consts.CO_COROUTINE and
- not self.pycode.co_flags & (consts.CO_COROUTINE |
- consts.CO_ITERABLE_COROUTINE)):
- raise oefmt(self.space.w_TypeError,
- "cannot 'yield from' a coroutine object "
- "from a generator")
+ if isinstance(w_gen, Coroutine):
+ if (w_gen.descr_gi_code(w_gen).co_flags & consts.CO_COROUTINE and
+ not self.pycode.co_flags & (consts.CO_COROUTINE |
+ consts.CO_ITERABLE_COROUTINE)):
+ raise oefmt(self.space.w_TypeError,
+ "cannot 'yield from' a coroutine object "
+ "from a generator")
try:
if space.is_none(w_value):
w_retval = space.next(w_gen)
@@ -1424,13 +1426,15 @@
def GET_YIELD_FROM_ITER(self, oparg, next_instr):
from pypy.interpreter.astcompiler import consts
+ from pypy.interpreter.generator import Coroutine
w_iterable = self.popvalue()
+ if isinstance(w_iterable, Coroutine):
+ if not self.pycode.co_flags & (consts.CO_COROUTINE |
+ consts.CO_ITERABLE_COROUTINE):
+ raise oefmt(self.space.w_TypeError,
+ "cannot 'yield from' a coroutine object "
+ "in a non-coroutine generator")
w_iterator = self.space.iter(w_iterable)
- if not self.pycode.co_flags & (consts.CO_COROUTINE |
- consts.CO_ITERABLE_COROUTINE):
- raise oefmt(self.space.w_TypeError,
- "cannot 'yield from' a coroutine object "
- "in a non-coroutine generator")
self.pushvalue(w_iterator)
def GET_AWAITABLE(self, oparg, next_instr):
@@ -1459,7 +1463,6 @@
def GET_AITER(self, oparg, next_instr):
w_iterable = self.popvalue()
- import pdb; pdb.set_trace()
self.pushvalue(w_iterable)
def GET_ANEXT(self, oparg, next_instr):
More information about the pypy-commit
mailing list