[pypy-commit] pypy py3.6-asyncgen: Begin refactoring handling of .w_yielded_from

rlamy pypy.commits at gmail.com
Thu Oct 3 13:15:40 EDT 2019


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.6-asyncgen
Changeset: r97716:d157cd5db6ca
Date: 2019-10-03 16:35 +0100
http://bitbucket.org/pypy/pypy/changeset/d157cd5db6ca/

Log:	Begin refactoring handling of .w_yielded_from

diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -11,7 +11,7 @@
 class GeneratorOrCoroutine(W_Root):
     _immutable_fields_ = ['pycode']
 
-    w_yielded_from = None
+    _w_yielded_from = None
 
     def __init__(self, frame, name=None, qualname=None):
         self.space = frame.space
@@ -153,9 +153,9 @@
         # Called from execute_frame() just before resuming the bytecode
         # interpretation.
         space = self.space
-        w_yf = self.w_yielded_from
+        w_yf = self.get_delegate()
         if w_yf is not None:
-            self.w_yielded_from = None
+            self.set_delegate(None)
             try:
                 self.next_yield_from(frame, w_yf, w_arg_or_err)
             except OperationError as operr:
@@ -179,6 +179,12 @@
         else:
             return r_uint(0)
 
+    def get_delegate(self):
+        return self._w_yielded_from
+
+    def set_delegate(self, w_delegate):
+        self._w_yielded_from = w_delegate
+
     def next_yield_from(self, frame, w_yf, w_inputvalue_or_err):
         """Fetch the next item of the current 'yield from', push it on
         the frame stack, and raises Yield.  If there isn't one, push
@@ -209,7 +215,7 @@
             return
         else:
             frame.pushvalue(w_retval)
-            self.w_yielded_from = w_yf
+            self.set_delegate(w_yf)
             raise Yield
 
     def _leak_stopiteration(self, e):
@@ -259,8 +265,8 @@
         operr = OperationError(w_type, w_val, tb)
         operr.normalize_exception(space)
 
-        # note: w_yielded_from is always None if 'self.running'
-        if (self.w_yielded_from is not None and
+        # note: _w_yielded_from is always None if 'self.running'
+        if (self.get_delegate() is not None and
                     operr.match(space, space.w_GeneratorExit)):
             try:
                 self._gen_close_iter(space)
@@ -276,8 +282,8 @@
 
     def _gen_close_iter(self, space):
         assert not self.running
-        w_yf = self.w_yielded_from
-        self.w_yielded_from = None
+        w_yf = self.get_delegate()
+        self.set_delegate(None)
         self.running = True
         try:
             gen_close_iter(space, w_yf)
@@ -290,8 +296,8 @@
             return     # nothing to do in this case
         space = self.space
         operr = None
-        # note: w_yielded_from is always None if 'self.running'
-        w_yf = self.w_yielded_from
+        # note: _w_yielded_from is always None if 'self.running'
+        w_yf = self.get_delegate()
         if w_yf is not None:
             try:
                 self._gen_close_iter(space)
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1556,7 +1556,7 @@
         w_iterable = self.popvalue()
         w_iter = get_awaitable_iter(self.space, w_iterable)
         if isinstance(w_iter, Coroutine):
-            if w_iter.w_yielded_from is not None:
+            if w_iter.get_delegate() is not None:
                 # 'w_iter' is a coroutine object that is being awaited,
                 # '.w_yielded_from' is the current awaitable being awaited on.
                 raise oefmt(self.space.w_RuntimeError,
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -838,7 +838,7 @@
     gi_running = interp_attrproperty('running', cls=GeneratorIterator, wrapfn="newbool"),
     gi_frame   = GetSetProperty(GeneratorIterator.descr_gicr_frame),
     gi_code    = interp_attrproperty_w('pycode', cls=GeneratorIterator),
-    gi_yieldfrom=interp_attrproperty_w('w_yielded_from', cls=GeneratorIterator),
+    gi_yieldfrom=GetSetProperty(GeneratorIterator.get_delegate),
     __name__   = GetSetProperty(GeneratorIterator.descr__name__,
                                 GeneratorIterator.descr_set__name__),
     __qualname__ = GetSetProperty(GeneratorIterator.descr__qualname__,
@@ -862,7 +862,7 @@
     cr_running = interp_attrproperty('running', cls=Coroutine, wrapfn="newbool"),
     cr_frame   = GetSetProperty(Coroutine.descr_gicr_frame),
     cr_code    = interp_attrproperty_w('pycode', cls=Coroutine),
-    cr_await   = interp_attrproperty_w('w_yielded_from', cls=Coroutine),
+    cr_await=GetSetProperty(Coroutine.get_delegate),
     __name__   = GetSetProperty(Coroutine.descr__name__,
                                 Coroutine.descr_set__name__,
                                 doc="name of the coroutine"),
@@ -890,7 +890,7 @@
     ag_running = interp_attrproperty('running', cls=AsyncGenerator, wrapfn="newbool"),
     ag_frame   = GetSetProperty(AsyncGenerator.descr_gicr_frame),
     ag_code    = interp_attrproperty_w('pycode', cls=AsyncGenerator),
-    ag_await   = interp_attrproperty_w('w_yielded_from', cls=AsyncGenerator),
+    ag_await=GetSetProperty(AsyncGenerator.get_delegate),
     __name__   = GetSetProperty(AsyncGenerator.descr__name__,
                                 AsyncGenerator.descr_set__name__,
                                 doc="name of the async generator"),


More information about the pypy-commit mailing list