Author: Ronan Lamy <[email protected]>
Branch: py3.6-asyncgen
Changeset: r97727:ce7a9b715879
Date: 2019-10-04 21:19 +0100
http://bitbucket.org/pypy/pypy/changeset/ce7a9b715879/
Log: Move .resume_execute_frame() to PyFrame and simplify code
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -82,7 +82,7 @@
operr = OperationError(space.w_StopIteration, space.w_None)
raise operr
- w_result = self._invoke_execute_frame(frame, w_arg_or_err)
+ w_result = self._invoke_execute_frame(w_arg_or_err)
assert w_result is not None
# if the frame is now marked as finished, it was RETURNed from
@@ -100,8 +100,9 @@
else:
return w_result # YIELDed
- def _invoke_execute_frame(self, frame, w_arg_or_err):
+ def _invoke_execute_frame(self, w_arg_or_err):
space = self.space
+ frame = self.frame
if self.running:
raise oefmt(space.w_ValueError, "%s already executing", self.KIND)
ec = space.getexecutioncontext()
@@ -147,36 +148,6 @@
ec.set_sys_exc_info(current_exc_info)
return w_result
- def resume_execute_frame(self, frame, w_arg_or_err):
- # Called from execute_frame() just before resuming the bytecode
- # interpretation.
- space = self.space
- w_yf = self.get_delegate()
- if w_yf is not None:
- self.set_delegate(None)
- try:
- frame.next_yield_from(w_yf, w_arg_or_err)
- except OperationError as operr:
- operr.record_context(space, space.getexecutioncontext())
- return frame.handle_generator_error(operr)
- # Normal case: the call above raises Yield.
- # We reach this point if the iterable is exhausted.
- last_instr = jit.promote(frame.last_instr)
- assert last_instr & 1 == 0
- assert last_instr >= 0
- return r_uint(last_instr + 2)
-
- if isinstance(w_arg_or_err, SApplicationException):
- return frame.handle_generator_error(w_arg_or_err.operr)
-
- last_instr = jit.promote(frame.last_instr)
- if last_instr != -1:
- assert last_instr & 1 == 0
- frame.pushvalue(w_arg_or_err)
- return r_uint(last_instr + 2)
- else:
- return r_uint(0)
-
def get_delegate(self):
if self.frame is None:
return None
@@ -191,15 +162,6 @@
def set_delegate(self, w_delegate):
self.frame.w_yielding_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
- w_stopiteration_value and returns. May also just raise.
- """
- frame.next_yield_from(w_yf, w_inputvalue_or_err)
-
def _leak_stopiteration(self, e):
# Check for __future__ generator_stop and conditionally turn
# a leaking StopIteration into RuntimeError (with its cause
@@ -363,7 +325,7 @@
# generate 2 versions of the function and 2 jit drivers.
def _create_unpack_into():
jitdriver = jit.JitDriver(greens=['pycode'],
- reds=['self', 'frame', 'results'],
+ reds='auto',
name='unpack_into')
def unpack_into(self, results):
@@ -374,12 +336,10 @@
return
pycode = self.pycode
while True:
- jitdriver.jit_merge_point(self=self, frame=frame,
- results=results, pycode=pycode)
+ jitdriver.jit_merge_point(pycode=pycode)
space = self.space
try:
- w_result = self._invoke_execute_frame(
- frame, space.w_None)
+ w_result = self._invoke_execute_frame(space.w_None)
except OperationError as e:
if not e.match(space, space.w_StopIteration):
raise
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -320,6 +320,37 @@
ec.in_coroutine_wrapper = False
return w_gen
+ def resume_execute_frame(self, w_arg_or_err):
+ # Called from execute_frame() just before resuming the bytecode
+ # interpretation.
+ from pypy.interpreter.pyopcode import SApplicationException
+ space = self.space
+ w_yf = self.w_yielding_from
+ if w_yf is not None:
+ self.w_yielding_from = None
+ try:
+ self.next_yield_from(w_yf, w_arg_or_err)
+ except OperationError as operr:
+ operr.record_context(space, space.getexecutioncontext())
+ return self.handle_generator_error(operr)
+ # Normal case: the call above raises Yield.
+ # We reach this point if the iterable is exhausted.
+ last_instr = jit.promote(self.last_instr)
+ assert last_instr & 1 == 0
+ assert last_instr >= 0
+ return r_uint(last_instr + 2)
+
+ if isinstance(w_arg_or_err, SApplicationException):
+ return self.handle_generator_error(w_arg_or_err.operr)
+
+ last_instr = jit.promote(self.last_instr)
+ if last_instr != -1:
+ assert last_instr & 1 == 0
+ self.pushvalue(w_arg_or_err)
+ return r_uint(last_instr + 2)
+ else:
+ return r_uint(0)
+
def execute_frame(self, in_generator=None, w_arg_or_err=None):
"""Execute this frame. Main entry point to the interpreter.
'in_generator' is non-None iff we are starting or resuming
@@ -348,8 +379,7 @@
assert self.last_instr == -1
next_instr = r_uint(0)
else:
- next_instr = in_generator.resume_execute_frame(
- self, w_arg_or_err)
+ next_instr = self.resume_execute_frame(w_arg_or_err)
except pyopcode.Yield:
w_exitvalue = self.popvalue()
else:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit