Author: Raffael Tfirst <[email protected]>
Branch: py3.5-async
Changeset: r85682:e3c740229eb3
Date: 2016-07-13 21:05 +0200
http://bitbucket.org/pypy/pypy/changeset/e3c740229eb3/
Log: Implement GET_AWAITABLE, SETUP_ASYNC_WITH, BEFORE_ASYNC_WITH,
GET_AITER, GET_ANEXT pyopcodes (temporarily without additional error
checks), fix compiler test
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1421,19 +1421,36 @@
self.pushvalue(w_iterator)
def GET_AWAITABLE(self, oparg, next_instr):
- pass
+ w_iterable = self.popvalue()
+ self.pushvalue(w_iterable)
- def SETUP_ASYNC_WITH(self, oparg, next_instr):
- pass
+ def SETUP_ASYNC_WITH(self, offsettoend, next_instr):
+ res = self.popvalue()
+ block = WithBlock(self.valuestackdepth,
+ next_instr + offsettoend, self.lastblock)
+ self.lastblock = block
+ self.pushvalue(res)
def BEFORE_ASYNC_WITH(self, oparg, next_instr):
- pass
+ w_manager = self.peekvalue()
+ w_enter = self.space.lookup(w_manager, "__aenter__")
+ w_descr = self.space.lookup(w_manager, "__aexit__")
+ if w_enter is None or w_descr is None:
+ raise oefmt(self.space.w_AttributeError,
+ "'%T' object is not a context manager (no __aenter__/"
+ "__aexit__ method)", w_manager)
+ w_exit = self.space.get(w_descr, w_manager)
+ self.settopvalue(w_exit)
+ w_result = self.space.get_and_call_function(w_enter, w_manager)
+ self.pushvalue(w_result)
def GET_AITER(self, oparg, next_instr):
- pass
+ w_iterable = self.popvalue()
+ self.pushvalue(w_iterable)
def GET_ANEXT(self, oparg, next_instr):
- pass
+ w_iterable = self.popvalue()
+ self.pushvalue(w_iterable)
### ____________________________________________________________ ###
diff --git a/pypy/interpreter/test/test_compiler.py
b/pypy/interpreter/test/test_compiler.py
--- a/pypy/interpreter/test/test_compiler.py
+++ b/pypy/interpreter/test/test_compiler.py
@@ -621,7 +621,7 @@
yield 8
def generator():
yield from generator2()
- for i in generator(): return i
+ return next(generator())
res = f()
'''))
code = self.compiler.compile(snippet, '<tmp>', 'exec', 0)
@@ -629,7 +629,7 @@
w_d = space.newdict()
space.exec_(code, w_d, w_d)
w_res = space.getitem(w_d, space.wrap('res'))
- assert space.eq_w(w_res, space.wrap("8"))
+ assert space.eq_w(w_res, space.wrap(8))
def test_dont_inherit_flag(self):
# this test checks that compile() don't inherit the __future__ flags
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit