[pypy-commit] pypy py3.5-async: Create missing visit_AsyncFunctionDef with codegenerator for asyncfunctions in codegen (fixes startup errors)
raffael_t
pypy.commits at gmail.com
Sun Jul 10 14:49:36 EDT 2016
Author: Raffael Tfirst <raffael.tfirst at gmail.com>
Branch: py3.5-async
Changeset: r85649:0ebb9c362c57
Date: 2016-07-10 20:48 +0200
http://bitbucket.org/pypy/pypy/changeset/0ebb9c362c57/
Log: Create missing visit_AsyncFunctionDef with codegenerator for
asyncfunctions in codegen (fixes startup errors)
diff --git a/pypy/interpreter/astcompiler/codegen.py b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -387,6 +387,30 @@
for i in range(len(func.decorator_list)):
self.emit_op_arg(ops.CALL_FUNCTION, 1)
self.name_op(func.name, ast.Store)
+
+ def visit_AsyncFunctionDef(self, func):
+ self.update_position(func.lineno, True)
+ # Load decorators first, but apply them after the function is created.
+ self.visit_sequence(func.decorator_list)
+ args = func.args
+ assert isinstance(args, ast.arguments)
+ kw_default_count = 0
+ if args.kwonlyargs:
+ kw_default_count = self._visit_kwonlydefaults(args)
+ self.visit_sequence(args.defaults)
+ num_annotations = self._visit_annotations(func, args, func.returns)
+ num_defaults = len(args.defaults) if args.defaults is not None else 0
+ oparg = num_defaults
+ oparg |= kw_default_count << 8
+ oparg |= num_annotations << 16
+ code, qualname = self.sub_scope(AsyncFunctionCodeGenerator, func.name, func,
+ func.lineno)
+ self._make_function(code, oparg, qualname=qualname)
+ # Apply decorators.
+ if func.decorator_list:
+ for i in range(len(func.decorator_list)):
+ self.emit_op_arg(ops.CALL_FUNCTION, 1)
+ self.name_op(func.name, ast.Store)
def visit_Lambda(self, lam):
self.update_position(lam.lineno)
@@ -1539,6 +1563,21 @@
for i in range(start, len(func.body)):
func.body[i].walkabout(self)
+class AsyncFunctionCodeGenerator(AbstractFunctionCodeGenerator):
+
+ def _compile(self, func):
+ assert isinstance(func, ast.AsyncFunctionDef)
+ has_docstring = self.ensure_docstring_constant(func.body)
+ start = 1 if has_docstring else 0
+ args = func.args
+ assert isinstance(args, ast.arguments)
+ if args.args:
+ self.argcount = len(args.args)
+ if args.kwonlyargs:
+ self.kwonlyargcount = len(args.kwonlyargs)
+ if func.body:
+ for i in range(start, len(func.body)):
+ func.body[i].walkabout(self)
class LambdaCodeGenerator(AbstractFunctionCodeGenerator):
diff --git a/pypy/interpreter/astcompiler/symtable.py b/pypy/interpreter/astcompiler/symtable.py
--- a/pypy/interpreter/astcompiler/symtable.py
+++ b/pypy/interpreter/astcompiler/symtable.py
@@ -388,7 +388,6 @@
func.args.walkabout(self)
self.visit_sequence(func.body)
self.pop_scope()
-
def visit_Return(self, ret):
self.scope.note_return(ret)
More information about the pypy-commit
mailing list